利用QSystemTrayIcon类来实现最小化托盘,并实现像QQ那样有消息闪烁图标的效果
但是程序运行到最后有个让我找了很久都没有找到的问题,就是当点击了图标的MessageBox()后,程序就自动退了了,并且exit with code 0
代码贴出来分享,也希望这个问题能在大家的帮助下找到原因
main.cpp
1 2 3 4 5 6 7 8 9 10 11 |
#include "dialog.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialag w; w.show(); return a.exec(); } |
dialog.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include <QSystemTrayIcon> #include "ui_dialog.h" namespace Ui { class Dialog; } #include <QDialog> class Dialag : public QDialog { Q_OBJECT public: Dialag(QWidget *parent = 0); ~Dialag(); void InitUi(); void InitTray(); //初始化托盘 void InitLayout(); void closeEvent(QCloseEvent *); //在关闭窗口时候要重写该函数,为了最小化到托盘,而不是退出程序 void ShowMessageBox(); //像是托盘图表的messagebox(); protected: void changeEvent(QEvent *e); private: Ui::Dialog *ui; QSystemTrayIcon *tray; QTimer *timer; //用于闪烁ICON的定时器 int TimerCount; //用于计算定时器超时次数,单数显示图标,双数不显示 并且为0时候表示没有消息 private slots: void MenuExit(); //右键菜单 退出 void ShowNormal(); //正常显示 void iconIsActived(QSystemTrayIcon::ActivationReason); //托盘图表活动,无论是鼠标悬浮,或者双击,或者单击 void ShowClickMsg(); //点击了消息框后的响应函数 void qq_msg_com(); void updateIcon(); //定时器刚 }; #endif // DIALOG_H |
dialog.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
#include "dialog.h" #include <QMessageBox> #include <QCloseEvent> #include <QTimer> #include <QMenu> Dialag::Dialag(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); InitUi(); InitTray(); InitLayout(); } Dialag::~Dialag() { delete ui; } void Dialag::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } //初始化部件 void Dialag::InitUi() { timer=new QTimer(this); TimerCount=0; //初始化为零 } //初始化托盘 void Dialag::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(":icon")); tray->show(); connect(tray,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(iconIsActived(QSystemTrayIcon::ActivationReason))); connect(tray,SIGNAL(messageClicked()),this,SLOT(ShowClickMsg())); //模拟QQ消息到来时候的闪烁图表 } //初始化布局 void Dialag::InitLayout() {} //相应关闭窗口消息函数 void Dialag::closeEvent(QCloseEvent *event) { if(tray->isVisible()) { QMessageBox::about(this,tr("最小化"),tr("最小化到托盘")); this->hide(); event->ignore(); } } //响应右键菜单正常显示 void Dialag::ShowNormal() { timer->stop(); tray->setIcon(QIcon("image/icon.png")); //正常显示时候恢复原有图标,防止定时器在无显示图表时候被终止 this->show(); } //响应右键菜单 关闭程序 void Dialag::MenuExit() { exit(0); } //托盘图标活动l void Dialag::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 Dialag::ShowMessageBox() { QSystemTrayIcon::MessageIcon icon=QSystemTrayIcon::MessageIcon(1); //设置图表是标准的系统托盘 信息 tray->showMessage("you click","hello,tray",icon,10000); } //点击了消息框后的要响应的函数 void Dialag::ShowClickMsg() { QMessageBox::about(0,"click","you click the messagebox"); } //模拟QQ消息到来时候,托盘图表闪动 void Dialag::qq_msg_com() { timer->start(500); //每500ms都刷新一次 timer->setSingleShot(false); //如果为真,表示只重复一次,为假表示无限次循环 connect(timer,SIGNAL(timeout()),this,SLOT(updateIcon())); } //刷新托盘图标 void Dialag::updateIcon() { TimerCount++; if(TimerCount%2) { tray->setIcon(QIcon("image/null.png")); //实际上没有这个图标,然后会显示没有图表 } else { tray->setIcon(QIcon("image/icon.png")); } } |
问题就出现在点击了消息框,发射信号messageClicked()后,响应槽函数showClickMsg() 后程序就退出了……始终没有找到问题出现在哪里
关于QSystemTrayIcon类的介绍,参看QT 托盘类QSystemTrayIcon
发表评论
要发表评论,您必须先登录。