Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: saim от Апрель 16, 2013, 23:21



Название: QSystemTray
Отправлено: saim от Апрель 16, 2013, 23:21
Здравствуйте уважаемое общество ! Помогите з банальной проблемой ! Использую QSystemTray для своего приложения но вот в чем беда , при длительном пребывании в трее к-во иконок увеличивается получается  просто ппц ...  такая штука см Рис


Название: Re: QSystemTray
Отправлено: Bepec от Апрель 16, 2013, 23:23
Какое незаконченное сообщение :)
Здравствуйте уважаемое общество ! Помогите з банальной проблемой ! Использую QSystemTray для своего приложения но вот в чем беда , при длительном пребывании в трее к-во иконок увеличивается получается  просто ппц ...  такая штука см Рис

А увеличиваются скорее всего потому, что у тебя создаётся несколько объектов QSystemTray по мере работы программы. Приводи код, разберёмся.


Название: Re: QSystemTray
Отправлено: Alex Custov от Апрель 16, 2013, 23:50
Здравствуйте уважаемое общество ! Помогите з банальной проблемой ! Использую QSystemTray для своего приложения но вот в чем беда , при длительном пребывании в трее к-во иконок увеличивается получается  просто ппц ...  такая штука см Рис

прямо магия!


Название: Re: QSystemTray
Отправлено: saim от Апрель 17, 2013, 00:31
Code :
То что у меня в конструкторе :
Код:
     createMessageGroupBox();

    createActions();
    createTrayIcon();
    
    ui->action_DialogSuuport->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_S));
    connect (ui->action_DialogSuuport, SIGNAL(triggered()), this, SLOT(dialogSupp()));


    connect(trayIcon , SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
            this , SLOT(iconActivated(QSystemTrayIcon::ActivationReason))) ;

    QVBoxLayout *mainLayout = new QVBoxLayout ;
    mainLayout->addWidget(messageGroupBox);
    setLayout(mainLayout) ;
    QIcon icon_tray (":/sysTray/iconSysTray/tray_02.png");

    trayIcon->setIcon(icon_tray);
    trayIcon->setToolTip(tr("АРМ моніторингу хворих фенілкетонурією "));
    trayIcon->show();

Код:
void ARM::createTrayIcon()
{
    trayIconMenu = new QMenu (this) ;
    trayIconMenu->addAction(restoreAction) ;
    trayIconMenu->addSeparator();
    trayIconMenu->addAction(quit_Action) ;

    trayIcon = new QSystemTrayIcon(this) ;
    trayIcon->setContextMenu(trayIconMenu);
    return;
}
void ARM::createActions()
{
    restoreAction = new QAction(tr("&Відновити"), this) ;
    restoreAction->setIcon(QIcon(":/sysTray/iconSysTray/restore_1.jpg"));
    connect(restoreAction ,SIGNAL(triggered()),this , SLOT(showMaximized())) ;


    quit_Action = new QAction(tr("&Вихід") , this) ;
    quit_Action->setIcon(QIcon(":/sysTray/iconSysTray/exit.jpg"));
    connect(quit_Action , SIGNAL(triggered()) , qApp , SLOT(quit())) ;
    return;
}

void ARM::createMessageGroupBox()
{
    messageGroupBox = new QGroupBox(tr("00000000")) ;
    durationSpinBox = new QSpinBox ;
    durationSpinBox->setValue(10);
    titleEdit = new QLineEdit (tr("АРМ моніторингу хворих фенілкетонурією"));
    bodyEdit = new QTextEdit ;
    bodyEdit->setPlainText(tr("Програма знаходиться в системному треї"));
    QGridLayout *messageLayout = new QGridLayout(0) ;
    messageLayout->addWidget(durationSpinBox , 1, 1);
    messageLayout->addWidget(titleEdit ,2,1,1,4);
    messageLayout->addWidget(bodyEdit , 3,1,2,4);
    messageLayout->setColumnStretch(3,1);
    messageLayout->setRowStretch(4,1);
return;
}
void ARM::messageClicked()
{
    QMessageBox::information(0 , tr("Системний трей") , tr ("АРМ моніторингу хворих фенілкетонурією "));
    return ;
}
void ARM::showMessage()
{
    QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::Information ;
    trayIcon->showMessage(titleEdit->text() , bodyEdit->toPlainText(), icon ,
                          durationSpinBox->value() * 1000);
    return;
}
//---------------------------------------------------------------------------------------
void ARM::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
    switch (reason) {
    case QSystemTrayIcon::Trigger:
    case QSystemTrayIcon::DoubleClick:
        this->show();
        break;
    case QSystemTrayIcon::MiddleClick:
        showMessage();
        break;
    default:
        ;
    }
    return;
}
void ARM::setVisible(bool visible)
{
    restoreAction->setEnabled(isMaximized() || !visible);
    QMainWindow::setVisible(visible);
    if (visible == true)
    {
        this->restoreAction->setEnabled(false);
    }
    else this->restoreAction->setEnabled(true) ;
    return;
}
//press close
void ARM::closeEvent(QCloseEvent *event)
{
   //this->showMessage () ;
    QMessageBox MsB(0);
    QString ds;
    MsB.setWindowTitle(tr("Системний трей"));
    MsB.setText(tr("Програма буде продовжувати працювати"
                            "в системному треї . \n Для завершення роботи"
                             " натисніть 'Вихід' в \n контексному меню трея"));
    MsB.setStandardButtons(QMessageBox::Yes);
    MsB.setButtonText(QMessageBox::Yes,tr("Так"));
    MsB.setDefaultButton(QMessageBox::Yes);
    MsB.setIcon(QMessageBox::Information);
    QIcon icon_Msb(":/sysTray/iconSysTray/info_02.jpg");
    MsB.setWindowIcon(icon_Msb);
    int r = MsB.exec();
    switch(r)
    {
    case QMessageBox::Yes:
        {
            if(trayIcon->isVisible())
                {
                hide() ;
                event->ignore();
                this->showMessage();
                }
            }

    default:
        break;
        }
    return;
    }


Название: Re: QSystemTray
Отправлено: Fregloin от Апрель 17, 2013, 09:37
Сразу так и не понятно по коду.
Можно вопрос: зачем в конце каждой процедуры (void функции) вы ставите return?
Да и код немного по индусски написан, не в обиду.
А вообще пройдитесь по исходникам, поищете место вызова создания и регистрации вашего трея, может скорее всего где то он создается еще...


Название: Re: QSystemTray
Отправлено: ecspertiza от Апрель 17, 2013, 10:09
Обычно такое бывает если приложение "убивать". Или же не удаляется экземпляр QSystemTrayIcon при выходе из приложения.


Название: Re: QSystemTray
Отправлено: carrygun от Апрель 17, 2013, 10:15
А если потыкать в них или просто навести курсор они не пропадают? А то как писали выше, есть такая "бага".


Название: Re: QSystemTray
Отправлено: saim от Апрель 17, 2013, 21:17
Так спасибо , всем за помощь!

1) я не обижаюсь , все мы учимся ))
2) да пропадают, вот в чем суть когда на иконки навести курсор мышь они все пропадают остаётся только один


Название: Re: QSystemTray
Отправлено: Bepec от Апрель 18, 2013, 06:50
Значит у вас тупо некорректное завершение работы программы. Или вы при дебаге её тормозили с компилятора, или она у вас вылетает, а не закрывается :D