Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: xintrea от Январь 11, 2009, 00:04



Название: В программе сегфолтится isSystemTrayAvailable(). А в примере все в порядке.
Отправлено: xintrea от Январь 11, 2009, 00:04
Здравствуйте!


Есть в Qt такой замечательный пример qtdemo/examples/desktop/systray, который показывает как работать с иконкой в систрее. На его основе я добавил код в свою прогу, и столкнулся с такой ситуацией.

В функции main() у меня есть такой код

Код:
 Q_INIT_RESOURCE(mytetra);

 /*
 if(!QSystemTrayIcon::isSystemTrayAvailable()) {
  QMessageBox::critical(0, QObject::tr("Systray"),
                        QObject::tr("I couldn't detect any system tray on this system."));
  exit(1);
 }
 */

Если раскомментировать закомментированный кусок, получим сегфолт. Стек вызовов при сегфолте выглядит так (читать снизу-вверх)

Код:
#0  0xb73bd508 in XInternAtom () from /usr/lib/libX11.so.6
#1  0xb7cc7f06 in QSystemTrayIconSys::locateSystemTray () at util/qsystemtrayicon_x11.cpp:71
#2  0xb7cc7fdb in QSystemTrayIconPrivate::isSystemTrayAvailable_sys ()
    at util/qsystemtrayicon_x11.cpp:297
#3  0xb7cb2847 in QSystemTrayIcon::isSystemTrayAvailable () at util/qsystemtrayicon.cpp:346
#4  0x08061bd8 in main (argc=1, argv=0xbfddc554) at src/main.cpp:235

Самое интересное, что подобный кусок кода в примере сегфолта не вызывает.

Что делать? Как проверить наличие в системе системного трея, не вызвав при этом ошибку?


Название: Re: В программе сегфолтится isSystemTrayAvailable(). А в примере все в порядке.
Отправлено: Rcus от Январь 11, 2009, 00:28
Ошибка воспроизводится если вызвать QSystemTrayIcon::isSystemTrayAvailable() до создания QApplication, но вы же не делаете подобного... или делаете?


Название: Re: В программе сегфолтится isSystemTrayAvailable(). А в примере все в порядке.
Отправлено: ритт от Январь 11, 2009, 00:40
делает
Q_INIT_RESOURCE вызывается до создания QApplication...


Название: Re: В программе сегфолтится isSystemTrayAvailable(). А в примере все в порядке.
Отправлено: xintrea от Январь 11, 2009, 00:46
Делаю.

Не думал, что проверка наличия систрея связана с наличием объекта приложения.


Название: Re: В программе сегфолтится isSystemTrayAvailable(). А в примере все в порядке.
Отправлено: Sergey B. от Январь 11, 2009, 08:46
QApplication всегда должен быть первым, до использования любых классов Q*