Qt中的置顶窗口

qt中置顶窗口一般都知道用这个函数:

this->setWindowFlags(Qt::FramelessWindowHint);


但是这样会有一个问题:

当我在程序启动显示窗口的时候,不停的点击其他窗口,使当前运行的程序窗口获取不到焦点,那么程序窗口即使设置了FramelessWindowHint flag,

主窗口也并没有置顶。代码如下:

main.cpp

#include "mainwindow.h"
#include <QApplication>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
#include "mainwindow.h"

#include <QApplication>
#include <QDesktopWidget>
#include <QThread>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setFixedSize(QSize(QApplication::desktop()->width(), QApplication::desktop()->height()));
    // 一般情况下会自定义关闭按钮
    this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
    this->setAutoFillBackground(true);

    // 假设有其他资源需要初始化,如果构造时间较短,不容易看到效果。
    QThread::sleep(1);

}

MainWindow::~MainWindow()
{

}


程序开始运行后不停点击其他窗口(如QtCreator),就会发现窗口程序出现在任务栏,但是窗口并没有置顶。

具体原因还有待进一步研究。

尝试多种解决办法:

1.点击一个按钮后show出一个子置顶窗口。 (无效)

2.点击一个按钮后show出一个新的窗口(subwindow属性,父窗口为空,用智能指针管理内存)。(有效,但是新show出来的窗口不能响应事件,被最开始的窗口覆盖掉了);

...


后来想到直接用windows的置顶窗口的函数,但是还是会出现刚开始的那个问题。

然后尝试其他各种怪招。。。

最后无意之间将show();这句代码写到置顶窗口的构造函数就行了!


最终代码如下:

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <windows.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    //[!] 新增代码, 需要在.pro文件加上 LIBS += -lUser32
    ::SetWindowPos((HWND)w.winId(), HWND_TOPMOST, 0, 0, w.width(), w.height(), SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
    return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"

#include <QApplication>
#include <QDesktopWidget>
#include <QThread>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setFixedSize(QSize(QApplication::desktop()->width(), QApplication::desktop()->height()));
    // 一般情况下会自定义关闭按钮
    this->setWindowFlags(Qt::FramelessWindowHint/*|Qt::WindowStaysOnTopHint*/);// [!]需要注释qt的置顶属性
    this->setAutoFillBackground(true);

    // 假设有其他资源需要初始化,如果构造时间较短,不容易看到效果。
    QThread::sleep(1);

    //[!]新增代码
    show();
}



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值