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

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

若该文为原创文章,未经允许不得转载

原博主博客地址: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
}

 

 

效果

图片.png

       (下面的窗口,未去掉最大化最小化时的截图,后期做了后话,但截图就省了...)

图片.png

 

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

原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062

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

 


相关文章
|
算法 机器人 Linux
开源项目推荐:3D点云处理软件CloudCompare,基于Qt和OpenGL
开源项目推荐:3D点云处理软件CloudCompare,基于Qt和OpenGL
3735 0
开源项目推荐:3D点云处理软件CloudCompare,基于Qt和OpenGL
|
4月前
|
区块链
Qt程序发布(修改软件图标、版本号、打包)
Qt程序发布(修改软件图标、版本号、打包)
|
7月前
|
区块链
Qt-添加软件图标(logo)
Qt-添加软件图标(logo)
114 0
|
XML JSON 数据格式
Qt实现软件自动更新的一种简单方法
Qt实现软件自动更新的一种简单方法
835 0
Qt实现软件自动更新的一种简单方法
|
存储 编解码 关系型数据库
案例分享:Qt激光加工焊接设备信息化软件研发(西门子PLC,mysql数据库,用户权限控制,界面设计,参数定制,播放器,二维图,rgv小车,期限控制,参数调试等)
国产大型机床中Qt上位机激光焊接系统软件案例分享,介绍了Qt在国产化机床上的各种应用案例,并附上案例的具体功能界面供大家学习
案例分享:Qt激光加工焊接设备信息化软件研发(西门子PLC,mysql数据库,用户权限控制,界面设计,参数定制,播放器,二维图,rgv小车,期限控制,参数调试等)
|
存储 编解码 关系型数据库
案例分享:Qt工程机械真空激光焊接系统软件产品定制(西门子PLC,mysql数据库,用户权限控制,界面配置,参数定制,播放器,二维图标,rgv小车,期限控制,参数调试等)
基于Qt的真空焊接系统工程机械案例分享。1.ui由本司美工承担设计,显示分辨率1280 x 1024,同时支持鼠标操作。2.权限控制:三种权限,分为管理员(可以定制模块界面,修改产品名称等定制化软件和其他权限,同时具备编程员和操作员权限),编程员(新建工件,参数,调试功能等与生产相关的权限,同时具备操作员权限),操作员(加工相关的操作权限),三个等级对所有界面进行区分使用,并可进行管理;3.专家可增删改编程员,操作员;编程员可增删改操作员;4.与西门子PLC通讯,兼容S7全系,项目使用S7-1500...
案例分享:Qt工程机械真空激光焊接系统软件产品定制(西门子PLC,mysql数据库,用户权限控制,界面配置,参数定制,播放器,二维图标,rgv小车,期限控制,参数调试等)
案例分享:Qt政务标签设计器,标签排版软件定制与打印
案例分享:Qt政务标签设计器,标签排版软件定制与打印
案例分享:Qt政务标签设计器,标签排版软件定制与打印
|
编解码 Windows
案例分享:Qt出版社书籍配套U盘资源播放器软件定制(脚本关联播放器与资源文件,播放器,兼容win7,win10和mac)
案例分享:Qt出版社书籍配套U盘资源播放器软件定制(脚本关联播放器与资源文件,播放器,兼容win7,win10和mac)
案例分享:Qt出版社书籍配套U盘资源播放器软件定制(脚本关联播放器与资源文件,播放器,兼容win7,win10和mac)
|
存储 缓存 网络协议
QT应用编程: 基于UDP协议设计的大文件传输软件
QT应用编程: 基于UDP协议设计的大文件传输软件
991 0
QT应用编程: 基于UDP协议设计的大文件传输软件
QT应用编程:基于QT+HTTP协议设计的屏幕共享软件(只要有浏览器就可以访问)
QT应用编程:基于QT+HTTP协议设计的屏幕共享软件(只要有浏览器就可以访问)
443 0
QT应用编程:基于QT+HTTP协议设计的屏幕共享软件(只要有浏览器就可以访问)