原博主博客地址: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
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
#include
#include
#include
#include
#include
#include
#include
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://mp.blog.csdn.net/postedit/78474420