Qt实用技巧:软件演示版永久提示框

来源:互联网 发布:甘肃快3遗漏数据分析 编辑:程序博客网 时间:2024/05/28 17:05

原博主博客地址:http://blog.csdn.net/qq21497936

本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78474420

需求

        开启软件时需要在该窗口应用程序显示一个提示框,提示是演示版本的或这已经注册了:

        若通过验证:可以关闭,关闭后,可以按键继续呼出

        若未通过验证:不允许关闭,且每当改变窗口大小、将窗口移动出屏幕(单个屏幕)立马复位到初始位置

原理

        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_OBJECTpublic:    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}

效果


(下面的窗口,未去掉最大化最小化时候的截图,后期已经做了优化,但截图就省了。。。)




原博主博客地址:http://blog.csdn.net/qq21497936

本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78474420


原创粉丝点击