qt系统托盘显示、无主窗体
系統(tǒng)圖盤是應(yīng)用程序經(jīng)常用到的一個(gè)控件,當(dāng)應(yīng)用程序需要長時(shí)間存在的時(shí)候,這個(gè)控件會(huì)變得非常有用,比如,窗口隱藏,顯示,關(guān)于、關(guān)閉等接口都可以放在圖盤中處理,今天與到一個(gè)問題,需求是這樣的:只需要顯示圖盤,不需要主窗口,提示信息需要?jiǎng)討B(tài)的改變
? ? 看似很簡單的一個(gè)問題,我自己試了試之后,也倒騰了好一會(huì)兒,先看我的第一版程序,代碼如下
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("關(guān)于")); 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? ? 這些代碼是為主程序設(shè)置了圖盤,然后main函數(shù)中只需要new一個(gè)窗口,圖盤就自然顯示了,因?yàn)閳D盤自己show了。
? ? 不過這樣是有問題的,當(dāng)操作右鍵菜單事件(關(guān)于)后,關(guān)閉彈出的菜單?,圖盤也會(huì)隨之消息,主程序結(jié)束,個(gè)人人為是主程序的消息循環(huán)退出了導(dǎo)致圖盤退出的,然后想辦法,試了以下幾種方式;
1、main函數(shù)中顯示窗口,并設(shè)置窗口無任務(wù)欄圖標(biāo)和最小化:?圖盤還是會(huì)消失
2、main函數(shù)顯示, 不做任何窗口設(shè)置:不消失
? ? 方法2的目的其實(shí)就是不讓主線程的消息循環(huán)退出?,那我們就朝著這個(gè)方向前進(jìn),把主窗體背景色設(shè)置透明,問題就迎刃而解了,經(jīng)過測試,果然可以,代碼如下:
w->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint );
w->setAttribute(Qt::WA_TranslucentBackground);
注意:窗口如果為QMainWindow,需要手動(dòng)去掉工具欄和狀態(tài)欄?
? ? 其實(shí)還有一種辦法,不過個(gè)人不建議使用,那就是在消息循環(huán)結(jié)束后立刻重啟一個(gè)消息循環(huán),總之就是主線程不退出,代碼如下:
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("我是標(biāo)題%1").arg(i++) 8 9 , QStringLiteral("我是內(nèi)容...") 10 11 , QSystemTrayIcon::Information, 1000); 12 13 }); 14 15 timer->start(1000); View Code? ? 我是使用了一個(gè)定時(shí)器,每隔1秒彈出一個(gè)提示,大家也可以根據(jù)自己的需求來在合適的時(shí)機(jī)彈出提示?
轉(zhuǎn)載于:https://www.cnblogs.com/swarmbees/p/5621489.html
總結(jié)
以上是生活随笔為你收集整理的qt系统托盘显示、无主窗体的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++的类型转换
- 下一篇: 虚拟化基础架构Windows 2008篇