网站建设使用的语言,国内新闻,cnn头条新闻,广东模板网站建设报价基本上#xff0c;客户端软件都会有置顶某个窗口的需求。置顶窗口激活窗口#xff0c;两者不是同一个问题。有时候窗口置顶了#xff0c;并不代表该窗口属于激活状态。本文将尝试把这两个问题一起解决了#xff0c;请看下文#xff1a;
一、置顶窗口
通过函数setWindowF…基本上客户端软件都会有置顶某个窗口的需求。置顶窗口激活窗口两者不是同一个问题。有时候窗口置顶了并不代表该窗口属于激活状态。本文将尝试把这两个问题一起解决了请看下文
一、置顶窗口
通过函数setWindowFlags设置属性Qt::WindowStaysOnTopHint 即可。
#include mainwindow.h
#include ui_mainwindow.hMainWindow::MainWindow(QWidget *parent): QWidget(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);//this-setWindowFlags(Qt::WindowStaysOnTopHint);//top show
}MainWindow::~MainWindow()
{delete ui;
}
二、激活窗口
2.1、设置定时器
在窗口初始化时设置定时器定时执行激活窗口的代码。至于缺点也显而易见定时重复激活窗口即使不需要重新激活窗口也会重复激活浪费计算资源。
#include mainwindow.h
#include ui_mainwindow.h
#include QTimerMainWindow::MainWindow(QWidget *parent): QWidget(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);//this-setWindowFlags(Qt::WindowStaysOnTopHint);QTimer *t new QTimer;t-start(500);QObject::connect(t, QTimer::timeout, [this]() {this-raise(); //提升该窗口到父窗口堆栈的顶部this-show(); //显示窗口this-activateWindow(); //激活窗口});
}MainWindow::~MainWindow()
{delete ui;
}2.2、事件重载-休眠唤醒激活方法(推荐)
重载窗体类的changeEvent函数通过监听QEvent::ActivationChange来判断窗口是否处于激活状态如果不是则激活窗口。
#include mainwindow.h
#include ui_mainwindow.h
#include QTimer
#include QThread
#include windows.h//SetWindowPosMainWindow::MainWindow(QWidget *parent): QWidget(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);//this-setWindowFlags(Qt::WindowStaysOnTopHint);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::changeEvent(QEvent *event)
{QWidget::changeEvent(event);if (event-type() QEvent::ActivationChange){if (this-isActiveWindow()){// The window is already activereturn;}else{
#if 1QThread::msleep(10);this-raise(); //主窗体显示堆栈置顶this-show(); //显示窗体this-activateWindow(); //激活主窗体
#else//same with prev method.setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);::SetWindowPos((HWND)winId(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
#endif}}
}