QT笔记1__界面基类QWidget、QMainWindow、QDialog
一、 Qt窗口部件基类
当我们创建一个QTGUI应用程序时,有向导默认的基类有三个:QWidget、QMainWindow和QDialog;而这三个窗口体也是最常用的。
其中QMainWindow是带有菜单栏和工具栏的窗口类,QDialog类是对话框窗口的基类,而QMainWindow、QDialog和其他所有窗口部件全部继承自QWidget. Qwidget继承自QObject类和QpaintDvice类.
二、3个主要窗口基类介绍
-
1、QWidget
QWidet类是所有用户界面对象的基类,被称作基础窗口部件。窗口部件是用户界面的一个基本单元,它从窗口系统接收鼠标,键盘和其他消息,并在屏幕上绘制自己。一个窗口部件可以被他的父窗口或者是其他窗口挡住一部分。Qwidget继承自QObject类和QpaintDvice类,其中QObject类是所有支持Qt对象模型的对象的基类,QPaintDvice类是所有可以绘制的对象的基类; -
2、QMainWindow
QMainWindow类提供一个带有菜单条,工具条和一个状态条的主应用程序窗口。主窗口通常提供一个大的中央窗口部件,以及周围菜单,工具条,和一个状态栏。QMainWindow窗口经常被继承,使得封装中央部件,菜单,工具条,状态栏等都变得很容易,当用户点击它的时候,相应的槽就会被调用。 -
3、QDialog
QDialog类是对话框窗口的基类,对话框窗口主要用于短期任务和用户进行短期通讯的顶级窗口,QDialog可以是模态对话框或者是非模态对话框。QDialog支持扩展并带有返回值,他们可以带有默认值
注意:
三、基础窗口部件QWidget
1. 窗口部件:窗口和子部件
- 窗口部件: 简称部件,窗口、对话框、标签、按钮、文本输入框等都是部件。这些部件既可以接受用户输入、显示数据和信息并在屏幕上绘制自己,甚至可以作为容器放置其他部件。
窗口:没有嵌入到其他部件中的部件称为窗口(顶级部件)。
顶级部件是有框架和标题栏的窗口(尽管使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装饰。)在Qt中,QMainWindow和不同的QDialog的子类是最普通的顶级窗口子部件:非窗口部件,称为子部件。
注意: 窗口和控件都继承自QWidget,如果不为控件指定父对象,它就会被作为窗口处理,这时setWindowsTitle()和setWindowIcon()函数就会生效;
代码
#include <QApplication> #include <QWidget> #include <QString> #include <QLabel> int main(int argc, char *argv[]) { QApplication a(argc, argv); //创建Qwidget部件,没有指定父窗口,即parant=0,因此mWidget为窗口,即顶级部件; QWidget *mWidget = new QWidget(); mWidget->setWindowTitle(QString::fromLocal8Bit("我是mWidget窗口标题")); //创建Qlabel,并指定父窗口为mWidget,因此mLabelSon为子部件; QLabel *mLabelSon = new QLabel(mWidget);// mLabelSon->setText(QString::fromLocal8Bit("我是labelSon也是mWidget的子部件")); // //创建Qlabel部件,没有指定父窗口,即parant=0,因此mLabel为窗口,即顶级部件; //并且mLabel的setWindowTitle变为可用 QLabel *mLabel = new QLabel(); mLabel->setWindowTitle(QString::fromLocal8Bit("我是label窗口标题")); mLabel->setText(QString::fromLocal8Bit("我是label也是独立窗口")); mWidget->show(); mLabel->show(); int ret = a.exec(); delete mWidget; delete mLabel; return ret; }
结果:
- 窗口类型
Qwidget的构造函数有两个参数:QWidget* parant =0和QT::WindowFlages f=0。其中parant为父窗口指针,默认值为0;f是QT::WindowFlages类型,或者QT::WindowFlages和QT::WindowType的或组合;例如:
//指定窗口为对话框类型; QWidget* widget0=new QWidget(0,Qt::Dialog); //指定窗口为欢迎窗口类型并处于最上层; QWidget* widget1=new QWidget(0,Qt::SplashScreen|QT::WindowStayOnTopHint); // //窗口类型和功能的设置,采用函数setWindowFlags ( Qt::WindowFlags type ) // Qt::Widget //是一个窗口或部件,有父窗口就是部件,没有就是窗口 Qt::Window //是一个窗口,有窗口边框和标题 Qt::Dialog //是一个对话框窗口 Qt::Sheet //是一个窗口或部件Macintosh表单 Qt::Drawer //是一个窗口或部件Macintosh抽屉 Qt::Popup //是一个弹出式顶层窗口 Qt::Tool //是一个工具窗口 Qt::ToolTip //是一个提示窗口,没有标题栏和窗口边框 Qt::SplashScreen //是一个欢迎窗口,是QSplashScreen构造函数的默认值 Qt::Desktop //是一个桌面窗口或部件 Qt::SubWindow //是一个子窗口 //为窗口添加一些功能 Qt::FramelessWindowHint //直接隐藏 Qt::CustomizeWindowHint //关闭默认窗口标题提示 Qt::WindowTitleHint //为窗口修饰一个标题栏 Qt::WindowSystemMenuHint //为窗口修饰一个窗口菜单系统 Qt::WindowMinimizeButtonHint //为窗口添加最小化按钮 Qt::WindowMaximizeButtonHint //为窗口添加最大化按钮 Qt::WindowMinMaxButtonsHint //为窗口添加最大化和最小化按钮 Qt::WindowCloseButtonHint Qt::WindowContextHelpButtonHint Qt::FrameWindowHint: //没有边框的窗口 Qt::MacWindowToolBarButtonHint Qt::WindowFullscreenButtonHint Qt::BypassGraphicsProxyWidget Qt::WindowShadeButtonHint Qt::WindowStaysOnTopHint Qt::WindowStaysOnBottomHint Qt::WindowOkButtonHint Qt::WindowCancelButtonHint Qt::WindowTransparentForInput
- 自定义标题栏:Qt::CustomizeWindowHint
将Qt::CustomizeWindowHint与以下标志必须与这个标志一起使用才有效,否则窗口将有默认的标题栏
Qt::WindowTitleHint:显示窗口标题栏 Qt::WindowSystemMenuHint://显示系统菜单 Qt::WindowMinimizeButtonHint://显示最小化按钮 Qt::WindowMaximizeButtonHint://显示最大化按钮 Qt::WindowMinMaxButtonsHint://显示最小化按钮和最大化按钮 Qt::WindowCloseButtonHint://显示关闭按钮
- 设置窗口初始状态函数
//函数: void QWidget::setWindowState ( Qt::WindowStates windowState ) //枚举: WindowState { WindowNoState = 0x00000000, //正常状态 WindowMinimized = 0x00000001,//窗口最小化 WindowMaximized = 0x00000002,//窗口最大化 WindowFullScreen = 0x00000004,//窗口全屏 WindowActive = 0x00000008//窗口处于激活状态 }; //设置窗口大小 void QWidget::setFixedSize ( int w, int h )
2.窗口几何布局
窗口的几何设置函数包含两类:
包含框架: x()、y()、frameGeometry()、pos()和move()等函数;
不包含框架:geometry()、width() 、 height() 、rect() 、size()等函数;
测试代码如下
#include <QApplication> #include <QWidget> #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget *mWidget = new QWidget(); mWidget->resize(600, 400); //设置窗口不包含框架部分的大小 mWidget->move(100, 100); //设置窗口位置 mWidget->show(); //需要先显示窗口才能获得窗口几何尺寸; //获取不包含框架部分的窗口几何特性: int x = mWidget->x(); int y = mWidget->y(); QRect geoRect = mWidget->geometry(); qDebug("x:%d", x); qDebug("y:%d", y); qDebug() << "geoRect:" << geoRect << endl; //获取包含框架部分的窗口几何特性: int fx = mWidget->geometry().x(); int fy = mWidget->geometry().y(); QRect fraRect = mWidget->frameGeometry(); qDebug("fx:%d", fx); qDebug("fy:%d", fy); qDebug() << "fraRect:" << fraRect << endl; // delete mWidget; return a.exec(); }
输出结果:
3.其他设置:
//窗体标题
this->setWindowTitle(“Qt5.1 窗体应用”);
//窗体最大300300
this->setMaximumSize(300,300);
//窗体最小300300
this->setMinimumSize(300,300);
//背景红色
this->setStyleSheet(“background:red”);
//窗体 ICO图片,如图不起别名,后缀直接写图片全名。
this->setWindowIcon(QIcon(":/new/prefix1/ico"));
四、参考资料:
1、《C++ Qt5 范例开发大全》
2、《Qt Creator快速入门》