最小化到托盤並有圖標閃爍效果

利用QSystemTrayIcon類來實現最小化托盤,並實現像QQ那樣有消息閃爍圖標的效果ide

可是程序運行到最後有個讓我找了好久都沒有找到的問題,就是當點擊了圖標的MessageBox()後,程序就自動退了了,而且exit with code 0函數

 

代碼貼出來分享,也但願這個問題能在你們的幫助下找到緣由佈局

widget.hui

 

class Dialog : public QDialog {
    Q_OBJECT
public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
    void InitUi();
    void InitTray();                                //初始化托盤
    void InitLayout();
    void closeEvent(QCloseEvent *);    //在關閉窗口時候要重寫該函數,爲了最小化到托盤,而不是退出程序
    void ShowMessageBox();        //像是托盤圖表的messagebox();
protected:
    void changeEvent(QEvent *e);this

private:
    Ui::Dialog *ui;
    QSystemTrayIcon *tray;
    QTimer *timer;         //用於閃爍ICON的定時器
    int TimerCount;      //用於計算定時器超時次數,單數顯示圖標,雙數不顯示  而且爲0時候表示沒有消息spa

private slots:
    void MenuExit();       //右鍵菜單  退出
    void ShowNormal();  //正常顯示
    void iconIsActived(QSystemTrayIcon::ActivationReason); //托盤圖表活動,不管是鼠標懸浮,或者雙擊,或者單擊
    void ShowClickMsg();  //點擊了消息框後的響應函數
    void qq_msg_com();
    void updateIcon();       //定時器剛.net

}翻譯

 

Widget.cppcode

 

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    InitUi();
    InitTray();
    InitLayout();
}orm

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}
//初始化部件
void Dialog::InitUi()
{
       timer=new QTimer(this);
       TimerCount=0;  //初始化爲零

}
//初始化托盤
void Dialog::InitTray()
{
    QMenu *contexmenu=new QMenu(this);           //注意右鍵菜單的父對象,在窗口銷燬後要把菜單也銷燬掉
    QAction *shut=new QAction("quit",this);                  //菜單中兩個動做
    QAction *openNomal=new QAction("show normal",this);
    QAction *qqmsg=new QAction("QQ Msg",this);
    contexmenu->addAction(shut);
    contexmenu->addSeparator();
    contexmenu->addAction(openNomal);
    contexmenu->addSeparator();
    contexmenu->addAction(qqmsg);
    connect(shut,SIGNAL(triggered()),this,SLOT(MenuExit()));          //點擊了這兩個菜單
    connect(openNomal,SIGNAL(triggered()),this,SLOT(ShowNormal()));
    connect(qqmsg,SIGNAL(triggered()),this,SLOT(qq_msg_com()));
    tray=new QSystemTrayIcon(this);
    tray->setToolTip("try to click");   //放在圖表上時候顯示
    tray->setContextMenu(contexmenu);
    tray->setIcon(QIcon("image/icon.png"));
    tray->show();
    connect(tray,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(iconIsActived(QSystemTrayIcon::ActivationReason)));
    connect(tray,SIGNAL(messageClicked()),this,SLOT(ShowClickMsg()));  //模擬QQ消息到來時候的閃爍圖表
}
//初始化佈局
void Dialog::InitLayout()
{}
//相應關閉窗口消息函數
void Dialog::closeEvent(QCloseEvent *event)
{
    if(tray->isVisible())
    {
        QMessageBox::about(this,tr("最小化"),tr("最小化到托盤"));
        this->hide();
        event->ignore();
    }

}
//響應右鍵菜單正常顯示
void Dialog::ShowNormal()
{
    timer->stop();
    tray->setIcon(QIcon("image/icon.png"));   //正常顯示時候恢復原有圖標,防止定時器在無顯示圖表時候被終止
    this->show();
}
//響應右鍵菜單 關閉程序
void Dialog::MenuExit()
{
    exit(0);
}
//托盤圖標活動l
void Dialog::iconIsActived(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason)
    {
        case QSystemTrayIcon::DoubleClick:
            ShowNormal();
            break;
        case QSystemTrayIcon::Trigger:
           ShowMessageBox();
            break;
        case QSystemTrayIcon::Unknown:
                QMessageBox::about(this,"unkown","unkown activation");
                break;
    default:
                break;
    }
}
void Dialog::ShowMessageBox()
{
    QSystemTrayIcon::MessageIcon icon=QSystemTrayIcon::MessageIcon(1);  //設置圖表是標準的系統托盤  信息
     tray->showMessage("you click","hello,tray",icon,10000);
}
//點擊了消息框後的要響應的函數
void Dialog::ShowClickMsg()
{
    QMessageBox::about(0,"click","you click the messagebox");
}

//模擬QQ消息到來時候,托盤圖表閃動
void Dialog::qq_msg_com()
{
    timer->start(500);  //每500ms都刷新一次
    timer->setSingleShot(false);  //若是爲真,表示只重複一次,爲假表示無限次循環
    connect(timer,SIGNAL(timeout()),this,SLOT(updateIcon()));
}
//刷新托盤圖標
void Dialog::updateIcon()
{
    TimerCount++;
    if(TimerCount%2)
    {
        tray->setIcon(QIcon("image/null.png"));   //實際上沒有這個圖標,而後會顯示沒有圖表
    }
    else
    {
        tray->setIcon(QIcon("image/icon.png"));
    }
}

 

問題就出如今點擊了消息框,發射信號messageClicked()    

後,響應槽函數showClickMsg()  後程序就退出了......始終沒有找到問題出如今哪裏

 

 

關於QSystemTrayIcon類的介紹,參看 我來翻譯QT類  中的http://blog.csdn.net/xie376450483/archive/2010/10/21/5956351.aspx

相關文章
相關標籤/搜索