一、窗口与子部件
窗口: Qt中一般把没有嵌入到其他部件中的部件称为窗口,一般窗口都有边框和标题栏。例如:QDialog及QMainWindow的子类。窗口就是没有父部件的部件,所以又称为顶级部件(top-level widget)
子部件:嵌入在别的窗口中的部件,称为子部件(child widget) 例如一些lablel 和 button
(以上内容摘自:Qt Creator快速入门 第三版 霍亚飞)
https://doc.qt.io/qt-5/qtwidgets-widgets-windowflags-example.html
二 enum WindowType 窗口类型
Qt::Widget QWidget构造函数的默认值,如新的窗口部件没有父窗口部件,那么它是一个独立的窗口,否则它就是一个子部件。QWidget * parent = 0 和 Qt::WindowFlags f = 0,前面的parent指父窗口部件,默认值为0,表明没有父窗口;而后面的 f 参数是 Qt::WindowFlags 类型的,是 Qt::WindowType 的枚举类型值或者组合。
Qt::Window 无论是否有父窗口部件,新窗口部件都是一个窗口,通常带有一个窗口边框和一个标题栏
Qt::Dialog 是一个对话框
Qt::Sheet 是一个Macintosh表单
Qt::Drawer 是一个抽屉
Qt::Popup 是一个弹出式顶层窗口
Qt::Tool 新是一个工具窗口,它通常是一个用于显示工具按钮的小窗口,如果一个工具窗口有父窗口部件,则它将显示在父窗口部件的上面,否则,将相当于使用了Qt::WindowStaysOnTopHint展示。
Qt::Tooltip 是一个提示 框,没有标题栏和窗口边框
Qt:: SplashScreen 是一个欢迎窗口
Qt::Desktop 是桌面
Qt::SubWindow 是子窗口
Qt::Qt::ForeignWindow 表示此窗口对象是一个句柄,表示由另一个进程或使用本机代码手动创建的本机平台窗口
Qt::CoverWindow 指示该窗口表示一个覆盖窗口,该窗口在应用程序在BlackBerry平台上最小化时显示。
三 flags Qt::WindowFlags 枚举类型
Qt::CustomizeWindowHint 使用该flag时可与下面的falg搭配使用
Qt::WindowTitleHint 显示标题栏
Qt::WindowMinimizeButtonHint 显示最小化按钮
Qt::WindowMaximizeButtonHint 显示最大化按钮
Qt::WindowCloseButtonHint 显示关闭按钮
Qt::WindowStaysOnTopHint 使得该窗口部件位于其它窗口部件的顶部(上面)
Qt::FramelessWindowHint 没有边框的窗口,使用该falgs时,窗体无法移动以及缩放
Qt::WindowMinMaxButtonsHint 显示最小化按钮和最大化按钮
Qt::WindowSystemMenuHint 显示系统菜单
四 创建一个没有边框的窗口
1、新建一个Frameless类继承QWidget,在继承的这个类中满足需求
frameless.h
#ifndef FRAMELESS_H
#define FRAMELESS_H
#include <QWidget>
class Frameless : public QWidget
{
public:
Frameless(QWidget *parent=0);
};
#endif // FRAMELESS_H
frameless.cpp
Frameless::Frameless(QWidget *parent):
QWidget(parent)
{
setGeometry(parent->width()/2 -100, parent->height()/2 -100, 200, 200); //设置大小
this->setWindowFlags(Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_StyledBackground, true);
this->setStyleSheet(QString("background-color: rgb(149,131,153)"));
}
2 在 MianWindow.cpp 中使用该类,点击按钮即可预览自己写的 “无边框窗口了”,效果如图所示。
void MianWindow::on_btnNoFrame_clicked()
{
Frameless *dlg = new Frameless(this);
dlg->show();
}
3 但是发现这个子窗口移动不了,得改。有了,自己 重写这个类的移动事件
在frameless.h 中添加头文件 #include , 并声明函数
protected:
void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
private:
QPoint pressPoint;
在frameless.cpp中实现函数功能
void Frameless::mousePressEvent(QMouseEvent *e)
{
pressPoint = e->globalPos() - this->pos(); //e->globalPos()指相对最左边屏幕的原点
this->raise(); //窗口升为顶层窗口
}
void Frameless::mouseMoveEvent(QMouseEvent *e)
{
QPoint Pos = e->globalPos() - pressPoint;
move(Pos);
}