Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: UVV от Декабрь 29, 2009, 15:28



Название: signal slot, widget->show()
Отправлено: UVV от Декабрь 29, 2009, 15:28
Есть свясь сигнала со слотом, слот находится в MainWidow, а сигнал эмитится из paintEvent() одного из виджетов.
Слот:
Код:
void MainWindow::displayErrorMessage(const QString message)
{
   errorLogView->appendPlainText(message);
   errorLogView->show();
}

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


Название: Re: signal slot, widget->show()
Отправлено: Igors от Декабрь 29, 2009, 15:57
Сигнал эмитится из разных методов внутри paintEvent(), но иногда происходит следующее, PlainTextEdit промелькивает, т.е. появляется и исчезает.
В какую сторону смотреть? Кто-нибудь сталкивался с подобным?
Не сталкивался, но по смыслу сигналы из paintEvent (если уж без них никак нельзя обойтись) должны помещаться в очередь (т.е. connect должен создаваться с QueuedConnection)


Название: Re: signal slot, widget->show()
Отправлено: UVV от Декабрь 29, 2009, 16:04
Я пробовал и так и так, результат один и тот же ))


Название: Re: signal slot, widget->show()
Отправлено: Dendy от Декабрь 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);
}
 


Название: Re: signal slot, widget->show()
Отправлено: UVV от Декабрь 29, 2009, 18:17
Цитировать
...(const QString & message) <= reference to QString, not QString
А это принципиально?
Просто я собирался использовать QueuedConnection. Насколько я понял из руководства, слот будет обрабатываться последним в очереди, а в это время reference может быть уже не действительным.


Название: Re: signal slot, widget->show()
Отправлено: Dendy от Декабрь 29, 2009, 18:51
Хорошая практика рекомендует использовать константные ссылки на shared-классы вместо значений, чтобы избежать ненужного инкремента/декремента счётчика ссылок. Все значения, что обрабатываются не синхронно (QueuedConnection) ложатся в QVariant, который сам вызывает копирующий конструктор, автоматически увеличивая счётчик ссылок.


Название: Re: signal slot, widget->show()
Отправлено: Igors от Декабрь 29, 2009, 22:14
Цитировать
...(const QString & message) <= reference to QString, not QString
А это принципиально?
Просто я собирался использовать QueuedConnection. Насколько я понял из руководства, слот будет обрабатываться последним в очереди, а в это время reference может быть уже не действительным.
Можно повторить то же через postEvent (прикрепив данные к event), но думается с тем же результатом. Если у Вас есть show - значит есть и hide и надо смотреть его, возможно не сбивается show/hide