
功能:窗口最小化后甚至点击“hide”按钮将窗口隐藏到托盘。 通常最小化的窗口会在任务栏上显示一个按钮。当用户按一下这个图标,窗口就还原了。这是一个被大多数桌面环境,比如Windowsqt 最小化到托盘,KDE,GNOME所采取的普遍设计。不过,因为任务栏通常也是桌面边上一小行,容纳不了这些按钮,用户一般期望把那个不常见的程序隐藏起来,只在通知栏显示一个小图标,要使用的之后再点击那些小图标恢复窗口。这种做法很典型的事例是QQ和Winamp。最基本的模式是拦截窗口的最小化事件changeEvent(),通过重写changeEvent()即可。“hide”按钮的方法,是借助信号--槽来实现。-------------------------------------------------------------------- void TrayMenu::createActions() {//创建托盘项action_show = new QAction(this);action_quit = new QAction(this);action_login_home = new QAction(this);action_help = new QAction(this);action_about = new QAction(this);action_check_update = new QAction(this);action_setting = new QAction(this);//设置托盘项图标action_show->setIcon(QIcon(":/icon/open"));action_login_home->setIcon(QIcon(":/icon/home"));action_help->setIcon(QIcon(":/icon/help"));action_about->setIcon(QIcon(":/icon/about"));action_check_update->setIcon(QIcon(":/icon/update"));action_setting->setIcon(QIcon(":/icon/set"));action_quit->setIcon(QIcon(":/icon/quit"));//加载图片和提示QIcon icon(":/images/sysTray.png");systemTray = new QSystemTrayIcon(this);systemTray->setIcon(icon);systemTray->setToolTip("Hello, this is system tray!");注意:这里非常提醒,如果你的应用程序要移植到别的机器上,而且这个机器没有装Qt,QIcon的照片格式最好用png,而不要用ico等格式qt 最小化到托盘,否则托盘图标不能显示,会很麻烦。

//设置托盘想文本action_show->setText(QString("显示"));action_quit->setText(QString("退出"));action_login_home->setText(QString("登录网站"));action_help->setText(QString("帮助"));action_about->setText(QString("关于"));action_check_update->setText(QString("检查更新"));action_setting->setText(QString("设置"));//添加菜单项this->addAction(action_show);this->addAction(action_setting);this->addAction(action_login_home);this->addSeparator();this->addAction(action_help);this->addAction(action_about);this->addAction(action_check_update);this->addSeparator();this->addAction(action_quit);action_setting->setVisible(false);//设置信号连接(这里仅列出连接显示窗口的信号)QObject::connect(action_show, SIGNAL(triggered(bool)), this, SIGNAL(showWidget())); } LoginDialog::LoginDialog(QWidget *parent) : QDialog(parent) {QSystemTrayIcon *system_tray = new QSystemTrayIcon();//放在托盘提示信息、托盘图标system_tray ->setToolTip(QString("我就是托盘"));system_tray ->setIcon(QIcon(":/icon/login"));TrayMenu *tray_menu = new TrayMenu();system_tray->setContextMenu(tray_menu);//点击托盘执行的事件connect(system_tray , SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconIsActived(QSystemTrayIcon::ActivationReason)));connect(tray_menu, SIGNAL(showWidget()), this, SLOT(showNormal()));//显示托盘system_tray->show(); //托盘显示提示信息 system_tray->showMessage(QString("托盘标题"), QString("托盘显示内容")); } void LoginDialog::iconIsActived(QSystemTrayIcon::ActivationReason reason) {switch(reason){//点击托盘显示窗口case QSystemTrayIcon::Trigger:{showNormal();break;}//双击托盘显示窗口case QSystemTrayIcon::DoubleClick:{showNormal();break;}default:break;} } OK,这样我们的托盘功能就Over了!=============================================================================另://关闭到托盘void Widget::closeEvent(QCloseEvent *e){ e->ignore(); this->hide();}//最小化到托盘void Widget::changeEvent(QEvent *e){ if((e->type()==QEvent::WindowStateChange)&&this->isMinimized()) {QTimer::singleShot(100, this, SLOT(close())); }}或者(me)//点击窗口的“最小化"按钮会读取此变量(系统默认)---已实现void maxLinksGuard::changeEvent(QEvent * event ){ if(event->WindowStateChange) {switch(this->windowState()){//点击“最小化”按钮case Qt::WindowMinimized:this->hide();this->setWindowFlags(Qt::Tool);//隐藏任务栏上按钮systemTray->show();//显示托盘systemTray->showMessage(windowTitle(),"Here is system,double click will show!");//提示event->ignore();break;default:break;} }}//托盘图标事件--------已实现void maxLinksGuard::iconActivated(QSystemTrayIcon::ActivationReason reason){ switch (reason) {//单击托盘case QSystemTrayIcon::Trigger:{if(!this->isVisible()){this->setWindowFlags(Qt::Window); //显示之前恢复showNormal();}else{hide();}break;}//双击托盘---貌似不起作用case QSystemTrayIcon::DoubleClick:{ if(!this->isVisible()){this->setWindowFlags(Qt::Window); //显示之前恢复showNormal();}else{hide();}break;}case QSystemTrayIcon::MiddleClick:{break;}default: ;}}//点击窗口的“关闭”按钮触发closeEvent事件(关闭应用程序)----已实现void maxLinksGuard::closeEvent(QCloseEvent *event) {if (this->isVisible()){ QMessageBox::critical(NULL,QObject::tr("Prompt:"),QObject::tr("Are you sure you want to kill/stop the MaxLinksGuard?"));event->ignore();}else {event->accept(); }} ==========================================================
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-143555-1.html
这年头
中国遵守国际法则