当前位置:网站首页>QT实现窗口置顶、置顶状态切换、多窗口置顶优先关系
QT实现窗口置顶、置顶状态切换、多窗口置顶优先关系
2022-07-06 09:28:00 【Larry_Yanan】
我们使用QT进行界面开发时,可能会遇到需要将窗口置顶的情况。最常见的就是,需要制作一个悬浮工具栏,悬浮菜单,甚至是悬浮的画板。这就意味这我们需要将这个窗口置顶于“系统”以及我们自己“软件”的窗口之上。
其实实现的方法很简单,就是在创建这个窗口类的时候,在构造函数中的加一个Qt::WindowFlags
枚举标识
Widget::Widget(QWidget *parent)
: QWidget(parent,Qt::Widget | Qt::WindowStaysOnTopHint)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Qt::WindowStaysOnTopHint的意思就是窗口置顶的意思,设置了之后就能一直悬浮在桌面上面了。
有关其他的枚举标识,可以参考这个。Qt::WindowFlags枚举类型解析 像取消顶部工具条、无边框、弹窗化什么的,都可以实现。
现在有一种情况是,我们需要灵活切换窗口的置顶状态,那就可以直接调用相关的设置接口来实现。setWindowFlags();
具体的话是这样:
void Widget::on_pushButton_clicked()
{
if(!istop)
{
Qt::WindowFlags m_flags = windowFlags();
setWindowFlags(m_flags | Qt::WindowStaysOnTopHint);
show();
qDebug()<<"always top";
}else{
//Qt::WindowFlags m_flags = windowFlags();
//setWindowFlags(Qt::Widget);
setWindowFlags(NULL);
show();
qDebug()<<"no always top";
}
istop=!istop;
}
setWindowFlags(Qt::Widget);和setWindowFlags(NULL);都可以取消置顶状态,只要重新设置就可以了。但这样设置之后,窗口是默认不显示的,所以需要show一下。但show的时候,窗口会有明显的闪烁。这个还没能很好的解决。
另外还要一个问题,两个置顶窗口之间的优先级无法设置和判定,也就是说用同样的方法设置两个置顶窗口,他们之间的拖动,是可以覆盖住对方的,取决于当前焦点点击再哪个窗口里面。
这个问题,在某些场合里面是互斥违和的。
目前有一种方法是,把a对象设置成b对象的父类,那么b对象就始终置顶与a对象
Widget::Widget(QWidget *parent)
: QWidget(parent,Qt::Widget | Qt::WindowStaysOnTopHint)
, ui(new Ui::Widget)
{
ui->setupUi(this);
son_widget_1 = new QWidget(this);
son_widget_2 = new QWidget(son_widget_1);
son_widget_1->setWindowFlags(Qt::Dialog | Qt::WindowStaysOnTopHint);
son_widget_2->setWindowFlags(Qt::Dialog | Qt::WindowStaysOnTopHint);
son_widget_1->setWindowTitle("son_widget_1");
son_widget_2->setWindowTitle("son_widget_2");
son_widget_1->show();
son_widget_2->show();
}

这三个置顶窗口是互相叠加的,跟父子关系有关。(son_widget_1/2设置了Qt::Dialog,如果是Qt::Widget,在设置了父类的情况下,是父类的子部件)。
2022.5.25补充
感谢评论区的朋友提供更好的解决方式,解决了切换置顶时必须show所导致的闪烁问题,以下是验证过可行的代码:
void Widget::on_pushButton_clicked()
{
if(!istop)
{
// Qt::WindowFlags m_flags = windowFlags();
// setWindowFlags(m_flags | Qt::WindowStaysOnTopHint);
// show();
qDebug()<<"always top";
QWindow* pWin = this->windowHandle();
pWin->setFlags(Qt::Widget | Qt::WindowStaysOnTopHint);
}else{
//Qt::WindowFlags m_flags = windowFlags();
// setWindowFlags(Qt::Widget);
// //setWindowFlags(NULL);
// show();
QWindow* pWin = this->windowHandle();
pWin->setFlags(Qt::Widget);
qDebug()<<"no always top";
}
istop=!istop;
}
边栏推荐
- [exercise-5] (UVA 839) not so mobile (balance)
- Opencv learning log 14 - count the number of coins in the picture (regardless of overlap)
- Auto. Getting started with JS
- Interval sum ----- discretization
- 7-1 understand everything (20 points)
- 信息安全-安全编排自动化与响应 (SOAR) 技术解析
- 【练习-7】Crossword Answers
- Opencv learning log 13 corrosion, expansion, opening and closing operations
- 【练习-6】(Uva 725)Division(除法)== 暴力
- Opencv learning log 24 -- Hough transform 2 (maximum interval and minimum length can be limited)
猜你喜欢

Programmers, what are your skills in code writing?

Differential (one-dimensional, two-dimensional, three-dimensional) Blue Bridge Cup three body attack

Gartner:关于零信任网络访问最佳实践的五个建议

1855. Maximum distance of subscript alignment

Penetration testing (5) -- a collection of practical skills of scanning King nmap and penetration testing tools

Essai de pénétration (1) - - outils nécessaires, navigation
![[exercise-5] (UVA 839) not so mobile (balance)](/img/8e/48dcf75f7347b36301df6fc129c09d.png)
[exercise-5] (UVA 839) not so mobile (balance)

Borg maze (bfs+ minimum spanning tree) (problem solving report)
快速转 TypeScript 指南

C language is the watershed between low-level and high-level
随机推荐
对iptables进行常规操作
What is the difficulty of programming?
“鬼鬼祟祟的”新小行星将在本周安全掠过地球:如何观看
Frida hook so layer, protobuf data analysis
[exercise-1] (UVA 673) parentheses balance/ balanced brackets (stack)
Opencv learning log 32 edge extraction
【练习-6】(PTA)分而治之
【练习-5】(Uva 839)Not so Mobile(天平)
1855. Maximum distance of subscript alignment
b站 实时弹幕和历史弹幕 Protobuf 格式解析
Opencv learning log 13 corrosion, expansion, opening and closing operations
信息安全-史诗级漏洞Log4j的漏洞机理和防范措施
Shell Scripting
Web based photo digital printing website
Information security - security professional name | CVE | rce | POC | Vul | 0day
信息安全-威胁检测-NAT日志接入威胁检测平台详细设计
Ball Dropping
树莓派4B64位系统安装miniconda(折腾了几天终于解决)
【高老师软件需求分析】20级云班课习题答案合集
【练习-4】(Uva 11988)Broken Keyboard(破损的键盘) ==(链表)