System Tray Icon Example展示了怎么样用菜单和弹出消息添加一个图标到桌面环境的系统托盘。现代操作系统通常在桌面提供一个特别的区域,称为系统托盘或通知区域。在这里长时间运行的应用可以展示图标和短信息。
本例子只有一个类:Window,提供应用程序窗口和关联的图标。
那个编辑器允许用户选择喜欢的图标和设置冒泡信息类型。用户也可以编辑信息的标题和内容。最后,这个编辑器提供一个checkBox控制是否在系统托盘里显示图标。
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(systray);
QApplication app(argc, argv);
if (!QSystemTrayIcon::isSystemTrayAvailable()) {
QMessageBox::critical(0, QObject::tr("Systray"),
QObject::tr("I couldn't detect any system tray "
"on this system."));
return 1;
}
QApplication::setQuitOnLastWindowClosed(false);
Window window;
window.show();
return app.exec();
}
QSystemTrayIcon在系统托盘里提供一个应用程序的图标。QSystemTrayIcon可以在下面平台使用:
1. 所有版本的windows
2. 所有freedesktop.org实现的有系统托盘的X11窗口管理器,包括最近版本的KDE,GNOME。
3. 所有版本的Mac OS X。
检查是否支持系统托盘: QSystemTrayIcon::isSystemTrayAvailable()
在系统托盘添加一个条目,创建一个QSystemTrayIcon(),调用setContextMenu()给Icon提供一个文本菜单,show()就让他显示出来,状态通知信息可以在任何时候展示出来通过使用showMessage()。当用户激活这个Icon就会发送activated()信号。
setQuitOnLastWindowClosed当上一个窗口关闭时,设置是否隐式地关闭应用程序。默认是true。即关闭。如果将这里注释掉,并且将Window::closeEvent中的event->ignore()注释掉。那么当我们关闭窗口时,弹出MessageBox,关闭MessageBox后,程序就不会在后台继续运行了,会默认的关闭掉。
class Window : public QDialog
{
Q_OBJECT
public:
Window();
void setVisible(bool visible);
protected:
void closeEvent(QCloseEvent *event);
private slots:
void setIcon(int index);
void iconActivated(QSystemTrayIcon::ActivationReason reason);
void showMessage();
void messageClicked();
private:
void createIconGroupBox();
void createMessageGroupBox();
void createActions();
void createTrayIcon();
QGroupBox *iconGroupBox;
QLabel *iconLabel;
QComboBox *iconComboBox;
QCheckBox *showIconCheckBox;
QGroupBox *messageGroupBox;
QLabel *typeLabel;
QLabel *durationLabel;
QLabel *durationWarningLabel;
QLabel *titleLabel;
QLabel *bodyLabel;
QComboBox *typeComboBox;
QSpinBox *durationSpinBox;
QLineEdit *titleEdit;
QTextEdit *bodyEdit;
QPushButton *showMessageButton;
QAction *minimizeAction;
QAction *maximizeAction;
QAction *restoreAction;
QAction *quitAction;
QSystemTrayIcon *trayIcon;
QMenu