Russian Qt Forum
Сентябрь 30, 2024, 14:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: signal slot, widget->show()  (Прочитано 4034 раз)
UVV
Гость
« : Декабрь 29, 2009, 15:28 »

Есть свясь сигнала со слотом, слот находится в MainWidow, а сигнал эмитится из paintEvent() одного из виджетов.
Слот:
Код:
void MainWindow::displayErrorMessage(const QString message)
{
   errorLogView->appendPlainText(message);
   errorLogView->show();
}

errorLogView - это QPlainTextEdit.
Сигнал эмитится из разных методов внутри paintEvent(), но иногда происходит следующее, PlainTextEdit промелькивает, т.е. появляется и исчезает.
В какую сторону смотреть? Кто-нибудь сталкивался с подобным?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Декабрь 29, 2009, 15:57 »

Сигнал эмитится из разных методов внутри paintEvent(), но иногда происходит следующее, PlainTextEdit промелькивает, т.е. появляется и исчезает.
В какую сторону смотреть? Кто-нибудь сталкивался с подобным?
Не сталкивался, но по смыслу сигналы из paintEvent (если уж без них никак нельзя обойтись) должны помещаться в очередь (т.е. connect должен создаваться с QueuedConnection)
Записан
UVV
Гость
« Ответ #2 : Декабрь 29, 2009, 16:04 »

Я пробовал и так и так, результат один и тот же ))
Записан
Dendy
Гость
« Ответ #3 : Декабрь 29, 2009, 17:35 »

Попробуйте складывать сообщения в одно, а лучше - немного переделать слот:

Код
C++ (Qt)
QBasicTimer errorLogTimer;
QStringList errorLogPendingMessages;
 
void MainWindow::displayErrorMessage(const QString & message) <= reference to QString, not QString
{
  pendingMessages << message;
  if ( !errorLogTimer.isActive() )
     errorLogTimer.start(0, this);
}
 
void MainWindow::timerEvent(QTimerEvent * e)
{
  if ( e->timerId() == errorLogTimer.timerId() )
  {
     errorLogTimer.stop();
     foreach (const QString & message, errorLogPendingMessages)
        errorLogView->appendPlainText(message);
     errorLogView->show();
     return;
  }
  ...
  ParentClass::timerEvent(e);
}
 
Записан
UVV
Гость
« Ответ #4 : Декабрь 29, 2009, 18:17 »

Цитировать
...(const QString & message) <= reference to QString, not QString
А это принципиально?
Просто я собирался использовать QueuedConnection. Насколько я понял из руководства, слот будет обрабатываться последним в очереди, а в это время reference может быть уже не действительным.
Записан
Dendy
Гость
« Ответ #5 : Декабрь 29, 2009, 18:51 »

Хорошая практика рекомендует использовать константные ссылки на shared-классы вместо значений, чтобы избежать ненужного инкремента/декремента счётчика ссылок. Все значения, что обрабатываются не синхронно (QueuedConnection) ложатся в QVariant, который сам вызывает копирующий конструктор, автоматически увеличивая счётчик ссылок.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Декабрь 29, 2009, 22:14 »

Цитировать
...(const QString & message) <= reference to QString, not QString
А это принципиально?
Просто я собирался использовать QueuedConnection. Насколько я понял из руководства, слот будет обрабатываться последним в очереди, а в это время reference может быть уже не действительным.
Можно повторить то же через postEvent (прикрепив данные к event), но думается с тем же результатом. Если у Вас есть show - значит есть и hide и надо смотреть его, возможно не сбивается show/hide
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.117 секунд. Запросов: 23.