Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Зависание GUI
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
vizir1989
у меня есть некая процедура, которая в цикле добавляет данные в таблицу. Для того, чтобы во время добавления данных интерфейс не тормозил, в цикл добавлена следующая строчка:
qApp->processEvents();

Так же на форме есть кнопка (QPushButton), у которого есть меню.

Если во время добавления данных в таблицу нажать на кнопку, то появляется меню кнопки, при этом процесс добавления данных в таблицу прекращается.
Пока меню отображается данные не добавляются, как только меню убирается, данные продолжают добавляться.

Вопрос, как сделать так, чтобы при появление меню добавление данных не прекращалось?
Trisch
Функция qApp->processEvents() используется во время "простоя", то есть, если программа, к примеру, занимается копированием файлов, вы можете вызвать с помощью этой функции функцию, которая будет показывать что программа занята (к примеру, вращающиеся песочные часы). При выходе программы из "простоя" вышеуказанная функция завершается.

Для добавления данных в таблицу используйте отдельный поток. За это отвечает класс QThread.
Litkevich Yuriy
Цитата(Trisch @ 17.3.2014, 17:40) *
Функция qApp->processEvents() используется во время "простоя", то есть, если программа, к примеру, занимается копированием файлов, вы можете вызвать с помощью этой функции функцию, которая будет показывать что программа занята (к примеру, вращающиеся песочные часы)
Неверно. Эта функция предназначена для обработки событий, когда программа занята. Т.е. автор темы пользуется ею правильно.


Цитата(Trisch @ 17.3.2014, 17:40) *
Для добавления данных в таблицу используйте отдельный поток.
Это правильная мысль.
vizir1989
Цитата(Litkevich Yuriy @ 17.3.2014, 18:23) *
Цитата(Trisch @ 17.3.2014, 17:40) *
Функция qApp->processEvents() используется во время "простоя", то есть, если программа, к примеру, занимается копированием файлов, вы можете вызвать с помощью этой функции функцию, которая будет показывать что программа занята (к примеру, вращающиеся песочные часы)
Неверно. Эта функция предназначена для обработки событий, когда программа занята. Т.е. автор темы пользуется ею правильно.


Цитата(Trisch @ 17.3.2014, 17:40) *
Для добавления данных в таблицу используйте отдельный поток.
Это правильная мысль.


Дело в том, что я добавляю в таблицу QTableWidget\QTableView, а Qt не рекомендует работать с этими объектами в отдельном потоке. Я использовал QtConcurrent::run, на что получал кучу предупреждений во время выполнения программы:
QPixmap: it is not safe to use pixmap outside the GUI thread
QPainter::begin: Paint device returned == 0, type: 2
QPainter::setRenderHint: Painter must be active to set rendering hints
QPainter::end: Painter not active, aborted.

И мне это не очень нравится.
Litkevich Yuriy
Цитата(vizir1989 @ 18.3.2014, 10:09) *
а Qt не рекомендует работать с этими объектами в отдельном потоке.
с классами GUI нужно работать в главном потоке. А вот данные для них можно готовить в отдельном потоке, передавая в основной.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.