qt系统托盘显示、无主窗体
系統圖盤是應用程序經常用到的一個控件,當應用程序需要長時間存在的時候,這個控件會變得非常有用,比如,窗口隱藏,顯示,關于、關閉等接口都可以放在圖盤中處理,今天與到一個問題,需求是這樣的:只需要顯示圖盤,不需要主窗口,提示信息需要動態的改變
? ? 看似很簡單的一個問題,我自己試了試之后,也倒騰了好一會兒,先看我的第一版程序,代碼如下
1 QSystemTrayIcon *tc = new QSystemTrayIcon; 2 3 tc->setToolTip(QStringLiteral("消息提示")); 4 5 tc->setIcon(style()->standardIcon(QStyle::SP_TitleBarNormalButton)); 6 7 tc->show(); 8 9 QMenu * menu = new QMenu; 10 11 QAction * aboutAct = menu->addAction(QStringLiteral("關于")); 12 13 connect(aboutAct, &QAction::triggered, this, []{ 14 15 QWindow * w = new QWindow; 16 17 w->show(); 18 19 }); 20 21 tc->setContextMenu(menu); View Code? ? 這些代碼是為主程序設置了圖盤,然后main函數中只需要new一個窗口,圖盤就自然顯示了,因為圖盤自己show了。
? ? 不過這樣是有問題的,當操作右鍵菜單事件(關于)后,關閉彈出的菜單?,圖盤也會隨之消息,主程序結束,個人人為是主程序的消息循環退出了導致圖盤退出的,然后想辦法,試了以下幾種方式;
1、main函數中顯示窗口,并設置窗口無任務欄圖標和最小化:?圖盤還是會消失
2、main函數顯示, 不做任何窗口設置:不消失
? ? 方法2的目的其實就是不讓主線程的消息循環退出?,那我們就朝著這個方向前進,把主窗體背景色設置透明,問題就迎刃而解了,經過測試,果然可以,代碼如下:
w->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint );
w->setAttribute(Qt::WA_TranslucentBackground);
注意:窗口如果為QMainWindow,需要手動去掉工具欄和狀態欄?
? ? 其實還有一種辦法,不過個人不建議使用,那就是在消息循環結束后立刻重啟一個消息循環,總之就是主線程不退出,代碼如下:
int ret = 0;
while (true)
{
ret = a.exec();
}
return a.exec();
? ? ?最后更改氣泡提示的方法比較簡單,代碼如下:
1 QTimer * timer = new QTimer(this); 2 3 connect(timer, &QTimer::timeout, this, [tc]{ 4 5 static size_t i = 0; 6 7 tc->showMessage(QStringLiteral("我是標題%1").arg(i++) 8 9 , QStringLiteral("我是內容...") 10 11 , QSystemTrayIcon::Information, 1000); 12 13 }); 14 15 timer->start(1000); View Code? ? 我是使用了一個定時器,每隔1秒彈出一個提示,大家也可以根據自己的需求來在合適的時機彈出提示?
轉載于:https://www.cnblogs.com/swarmbees/p/5621489.html
總結
以上是生活随笔為你收集整理的qt系统托盘显示、无主窗体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++的类型转换
- 下一篇: Selenium IDE安装