利用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