Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как перерисовать QTableWidget
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
skmdeveloper
Есть класс унаследованный от QTableWidget.

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

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

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

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

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

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


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

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

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

Одна проблема - одна тема
skmdeveloper
Цитата(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
Цитата(skmdeveloper @ 20.10.2009, 13:46) *
Я пишу программную платформу типа 1С Предприятия.

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

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

таймер поставь, ы?
Но я бы пошел другим путем, портировал бы:
http://www.1cpp.ru/docum/html/TableField.html
на Qt.
Одно "но" я не работал с моделями/представлениями плотно, может там все есть что мне надо..
skmdeveloper
Цитата(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
Вот сорцы:


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


ТЗ только в голове. Времени нет - кодирую почти целыми днями, пока выдалось свободное время.
MoPDoBoPoT
По-моему после изменения данных надо сигнализировать об этом
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
Проблема устранилась косвенным способом, после того как поправил еще одну проблему. Почему то после выбора элемента активным становилось не начальное дочернее окно, а первое по списку. Пришлось реализовать запоминание текущего окна
Раскрывающийся текст

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

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

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

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.