crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Как перерисовать QTableWidget
skmdeveloper
  опции профиля:
сообщение 20.10.2009, 5:33
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 18.9.2009
Пользователь №: 1107

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть класс унаследованный от QTableWidget.

В некоторые колонки значение выбирается с помощью диалога. Т.к. по некоторым причинам диалоговые окна применять у меня не годится, то возврат значений в ячейке проичходит программными ухищрениями, с помошью дополнительного объекта-приемника значений.

В принципе все работает. Но только QTableWidget перерисовывается, когда получает фокус мыши. Repaint() не помогает.

Как заставить перерисоваться виджет при программном изменении значений в таблице? Наверное, нужно как-то принудительно запустить цикл обработки событий. А как, не нашел.

P.S. И еще дополнительный вопрос. Как управлять внешним видом заголовка дочернего окна в MDI? Например сделать текст заголовка окна не по центру, а по левому краю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 20.10.2009, 8:25
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(skmdeveloper @ 20.10.2009, 6:33) *
В некоторые колонки значение выбирается с помощью диалога.

Т.е. сейчас у тебя используется диалог?

Цитата(skmdeveloper @ 20.10.2009, 6:33) *
диалоговые окна применять у меня не годится


И ты хочешь уйти от диалога, т.е. переписать код? Чем обычное редактирование ячейки не устраивает?

Цитата(skmdeveloper @ 20.10.2009, 6:33) *
Как заставить перерисоваться виджет при программном изменении значений в таблице?

Вроде как сам должен перерисовываться. Надо смотреть код.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.10.2009, 9:08
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(skmdeveloper @ 20.10.2009, 9:33) *
P.S. И еще дополнительный вопрос. Как управлять внешним видом заголовка дочернего окна в MDI? Например сделать текст заголовка окна не по центру, а по левому краю.
для этого сделай отдельную тему, если не подойдут имеющиеся на форуме.

Одна проблема - одна тема
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
skmdeveloper
  опции профиля:
сообщение 20.10.2009, 12:46
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 18.9.2009
Пользователь №: 1107

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 20.10.2009, 11:25) *
И ты хочешь уйти от диалога, т.е. переписать код? Чем обычное редактирование ячейки не устраивает?


Я пишу программную платформу типа 1С Предприятия.

Выбирать элементы справочника в недиалоговых окнах (как в 1С) у меня получается. Даже если справочник одновременно открыт в нескольких окнах, то изменения между ними синхронизируются, но почему-то только после получения ими фокуса мыши.

Вот функция-слот, которая получает возвращаемое значение:
Раскрывающийся текст
void UiReferenceWidget::setICell(int id, int column, const QVariant& value) { // на входе идентификатор строки, номер колонки, значение
    int row = findRow(id); // находим строку по идентификатору
    if(id > 0) {
        QTableWidgetItem *i = item(row,column); // получаем элемент таблицы
        if(i) {
            i->setData(Qt::EditRole,value); // изменяем значение
            setCurrentItem(i); // на всякий случай делаем ячейку текущей.
        }
    }
}


Ничего особенного, кажется.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 20.10.2009, 14:11
Сообщение #5


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

Спасибо сказали: 21 раз(а)




Репутация:   6  


Цитата(skmdeveloper @ 20.10.2009, 13:46) *
Я пишу программную платформу типа 1С Предприятия.

хм, я тоже.
Давно тебе говорил, хостанись и сцылку дай.

Цитата(skmdeveloper @ 20.10.2009, 13:46) *
Выбирать элементы справочника в недиалоговых окнах (как в 1С) у меня получается. Даже если справочник одновременно открыт в нескольких окнах, то изменения между ними синхронизируются, но почему-то только после получения ими фокуса мыши.

таймер поставь, ы?
Но я бы пошел другим путем, портировал бы:
http://www.1cpp.ru/docum/html/TableField.html
на Qt.
Одно "но" я не работал с моделями/представлениями плотно, может там все есть что мне надо..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
skmdeveloper
  опции профиля:
сообщение 20.10.2009, 15:01
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 18.9.2009
Пользователь №: 1107

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(trdm @ 20.10.2009, 17:11) *
Давно тебе говорил, хостанись и сцылку дай.


Пока некогда и нечего - код в постоянной разработке и переработке. Как только более-менее утрясется - выложу.

Цитата(trdm @ 20.10.2009, 17:11) *
Одно "но" я не работал с моделями/представлениями плотно, может там все есть что мне надо..


Это самое что нужно. Любые типы данных, в том числе объекты любых классов, можно приводить к типу QVariant и держать непосредственно в ячейках таблицы. А отображать их в ячейках в удобном виде.

Цитата(trdm @ 20.10.2009, 17:11) *
Но я бы пошел другим путем, портировал бы:
http://www.1cpp.ru/docum/html/TableField.html


Табличное поле и у меня планируется - таблица как обычный тип данных.

Ну я уж слишком много написал - привязываться к чему либо уже поздно. Табличные элементы управления у меня функционируют нормально - с MVC разобрался, кроме описанного мной почти не заметного в работе недостатка. Думаю, проблема все таки разрешима.
Тем более стараюсь по возможности придерживаться стиля Qt - а

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 20.10.2009, 15:17
Сообщение #7


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

Спасибо сказали: 21 раз(а)




Репутация:   6  


Вот сорцы:


А ТЗ есть? Намыль если есть, помотрю, где можем пересечься.
Могу свое в ответку кинуть, оно правда не доработано.
Прикрепленные файлы
Прикрепленный файл  CursorGrid.zip ( 125.54 килобайт ) Кол-во скачиваний: 131
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
skmdeveloper
  опции профиля:
сообщение 20.10.2009, 17:04
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 18.9.2009
Пользователь №: 1107

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(trdm @ 20.10.2009, 18:17) *
А ТЗ есть? Намыль если есть, помотрю, где можем пересечься.


ТЗ только в голове. Времени нет - кодирую почти целыми днями, пока выдалось свободное время.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 20.10.2009, 17:22
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


По-моему после изменения данных надо сигнализировать об этом
void UiReferenceWidget::setICell(int id, int column, const QVariant& value) { // на входе идентификатор строки, номер колонки, значение
    int row = findRow(id); // находим строку по идентификатору
    if(id > 0) {
        QTableWidgetItem *i = item(row,column); // получаем элемент таблицы
        if(i) {
            i->setData(Qt::EditRole,value); // изменяем значение
            setCurrentItem(i); // на всякий случай делаем ячейку текущей.

            emit cellChanged(row, column)/itemChanged(i); <==
        }
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
skmdeveloper
  опции профиля:
сообщение 20.10.2009, 19:05
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 18.9.2009
Пользователь №: 1107

Спасибо сказали: 0 раз(а)




Репутация:   0  


Проблема устранилась косвенным способом, после того как поправил еще одну проблему. Почему то после выбора элемента активным становилось не начальное дочернее окно, а первое по списку. Пришлось реализовать запоминание текущего окна
Раскрывающийся текст

_aw = mainWwindow()->mdiArea()->currentSubWindow(); // запоминаем текущее дочернее окно

// здесь необходимые действия

mainWwindow()->mdiArea()->setActiveSubWindow(_aw); // делаем активным исходное окно

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 18:25