若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78474420
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)
Qt开发专栏:实用技巧(点击传送门)
需求
开启软件时需要在该窗口应用程序显示一个提示框,提示是演示版本的或这已经注册了:
若通过验证:可以关闭,关闭后,可以按键继续呼出
若未通过验证:不允许关闭,且每当改变窗口大小、将窗口移动出屏幕(单个屏幕)立马复位到初始位置
原理
1.不允许关闭该提示窗口,不显示标题栏的“关闭”按钮,同时要防止”Ctrl+F4”关闭该窗口,那么必须在其close事件后调用show继续显示;
(拓展:“Ctrl+F4”可以用对按钮消息进行捕捉,忽略,使其实现屏蔽)
2.允许关闭的情况下,显示标题栏,标题栏带有关闭,可关闭;
3.启动时显示我们指定的默认大小,显示时先调用构造函数,构造函数完成后会触发resizeEvent事件,我们在resizeEvent事件中设置窗口大小;
4.改变窗口大小会触发resizeEvent事件,同3;
5.将窗口移动出屏幕会触发moveEvent时间,在moveEvent事件中处理,超出屏蔽后会复位显示位置;
代码
第一部分父窗口调用代码:
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // PreviewWindow // 显示:一直在父类窗口之上 _pPreviewWindow = new PreviewWindow(this); // 显示:焦点在哪个(本身或其父类)窗口上,就哪个窗口显示在前 // _pPreviewWindow = new PreviewWindow(); // _pPreviewWindow->setTexts(tr("未验证"), false); // _pPreviewWindow->setTexts(tr("已验证"), true); _pPreviewWindow->show(); } MainWindow::~MainWindow() { delete ui; }
第二部分窗口代码头文件:previewwindows.h
#ifndef PREVIEWWINDOW_H #define PREVIEWWINDOW_H #include <QMainWindow> class QTextBrowser; class PreviewWindow : public QMainWindow { Q_OBJECT public: explicit PreviewWindow(QWidget *parent = 0); public: // 参数1:提示语 参数2:是否通过验证 void setTexts(QString s, bool b); protected: // 消息:每次移动窗口的时候, 会触发该事件 void moveEvent(QMoveEvent *event); // 消息:每次重新更改窗口大小(拖动)的时候,会触发该事件 void resizeEvent(QResizeEvent *event); // 消息:每次关闭窗口的时候,会触发该时间 void closeEvent(QCloseEvent *event); private: QTextBrowser * _pTextBrowser; bool _b; }; #endif // PREVIEWWINDOW_H
第三部分窗口代码源文件:previewwindows.cpp
#include "previewwindow.h" #include <QDesktopWidget> #include <QTextBrowser> #include <QVBoxLayout> #include <QApplication> #include <QWidget> #include <QTimer> #include <QDebug> #include <QThread> PreviewWindow::PreviewWindow(QWidget *parent) : QMainWindow(parent) { // 去掉最小话和最大话窗口 setWindowFlags(windowFlags() & ~Qt::WindowMinMaxButtonsHint); _pTextBrowser = new QTextBrowser(this); QWidget *pWidget = new QWidget(this); QHBoxLayout *pLayout = new QHBoxLayout(pWidget); pLayout->addWidget(_pTextBrowser); pWidget->setLayout(pLayout); setCentralWidget(pWidget); setWindowTitle(tr("帮助")); } void PreviewWindow::setTexts(QString s,bool b) { _b = b; if (b) QWidget::setWindowFlags(windowFlags() & ~Qt::FramelessWindowHint & ~Qt::WindowTitleHint ); else QWidget::setWindowFlags(windowFlags() | Qt::FramelessWindowHint | Qt::WindowTitleHint); _pTextBrowser->setText(s); _pTextBrowser->setStyleSheet("background-color: yellow; color: red;"); } void PreviewWindow::moveEvent(QMoveEvent *event) { QDesktopWidget * pWidget = QApplication::desktop(); // 获取桌面的坐标(屏幕左上角是0,0) QRect rect = pWidget->availableGeometry(); if( geometry().left() < 0 || geometry().top() < 0 || geometry().right() > rect.right() || geometry().bottom() > rect.bottom()) // 显示geometry,不再父窗口widget也可显示 setGeometry(QRect(rect.width()/2-200, rect.height()/2-200, rect.width()/2,rect.height()/2)); } void PreviewWindow::resizeEvent(QResizeEvent *event) { QDesktopWidget * pWidget = QApplication::desktop(); QRect rect = pWidget->availableGeometry(); setGeometry(QRect(rect.width()/2-200, rect.height()/2-200, rect.width()/2,rect.height()/2)); } void PreviewWindow::closeEvent(QCloseEvent *event) { if(_b) return; #if 0 // 方式一:使用QTimer // QTimer::singleShot(0, this, SLOT(show())); #endif #if 1 // 方式二:使用QMetaObject // 注意:此处要指定方式,否则会由qt自己选择(不加次参数,测试结果为立即执行,执行完成后再从此处继续往下执行) QMetaObject::invokeMethod(this, "show", Qt::QueuedConnection); #endif }
效果
(下面的窗口,未去掉最大化最小化时的截图,后期做了后话,但截图就省了...)
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78474420