本节对应的视频讲解:B_站_链_接
https://www.bilibili.com/video/BV19B4y1s7YF
由于 QWidget
类是所有控件类的父类,因此本节课先讲解 QWidget
所有窗口类的基类
Qt
中有3
个窗口的基类:QWidget
、QMainWindow
、QDialog
在创建
Qt
工程时,会让我们选择继承自哪一个窗口类其中,
QMainWindow
、QDialog
都是继承自QWidge
所有控件类的基类
Qt
中的控件类(按钮、输入框、单选框等)也属于窗口类它们的基类也是
QWidget
;可以内嵌到其他窗口的内部,此时需要给其指定父窗口;
可以作为独立的窗口显示,此时不能给其指定父窗口;
1. 如何显示 QWidget 窗口
在之前的《2. 新建 Qt 工程》中,显示了一个基于QMainWindow
的窗口
本节从零新建一个基于 QWidget
的主窗口,并且再添加一个基于 QWidget
的窗口,并显示它
由于这是第一次,手动添加一个窗口类,所以详细列出步骤
1.1 新建基于 QWidget 的窗口类
和《2. 新建 Qt 工程》中基本一致,新建一个工程 QWidgetTest
,只是这里让主窗口继承自 QWidget
1.2 再添加一个 QWidget 窗口类
首先,右键单击【QWidgetTest】,点击【添加新文件…】
选择【Qt】->【Qt 设计师界面类】
选择模板
前三个对应 QDialog
,后面的两个分别对应 QMainWindow
和 QWidget
选择【Widget】,然后下一步
输入类名,然后点击下一步
汇总显示
点击完成之后,就可以将三个文件添加到项目中,并且自动在 .pro
项目文件中,添加了对应的行,如下:
1.3 显示新添加的 QWidget 窗口
为了便于显示,打开 subwidget.ui
设计师界面, 拖放一个按钮,如下:
然后来到 widget.cpp
文件中,添加如下代码,来显示 SubWidget
窗口:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
#if 0
// 未指定父窗口,那么这个窗口就是独立的窗口
// 需要调用其show方法来显示
SubWidget* subWidget = new SubWidget();
subWidget->setWindowTitle("SubWidget");
subWidget->show();
#endif
#if 1
// 如果指定了父窗口,那么就不用调用其show方法了
// 因为:父窗口显示时,会将其子窗口一起显示出来。
SubWidget* subWidget = new SubWidget(this);
subWidget->setWindowTitle("SubWidget");
// myWidget->show();
#endif
}
2. 常用的属性和方法
在上面,调用了 setWindowTitle
方法设置了窗口的标题,那么它还有哪些常用的方法呢?
可以点击 Qt Creator 左侧的【帮助】,切换到【索引】,输入QWidget
,就可以查看 QWidget
的详细帮助文档,如下:
2.1 窗口位置
// 1、设置窗体的几何信息
// 获取相对于当前窗口父窗口的几何信息:宽高、坐标点信息
const QRect &geometry() const;
void setGeometry(int x, int y, int w, int h);
void setGeometry(const QRect &);
// 2、移动窗口。
// 重新设置窗口的位置
void move(int x, int y);
void move(const QPoint &);
2.2 窗口大小
通常,窗口可以拖动其右下角,进行放大和缩小。我们可以设置窗口的最小大小和最大大小;
另外,窗口可以设置为固定大小,这样窗口就不能放大和缩小;
常用的设置大小的函数如下:
// 1、设置窗口尺寸
QSize size() const
void resize(int w, int h);
void resize(const QSize &);
// 2、设置最大尺寸
QSize maximumSize() const;
void setMaximumSize(const QSize &);
void setMaximumSize(int maxw, int maxh);
// 3、设置最小尺寸
QSize minimumSize() const;
void setMinimumSize(const QSize &);
void setMinimumSize(int minw, int minh);
// 4、设置固定尺寸
void QWidget::setFixedSize(const QSize &s);
void QWidget::setFixedSize(int w, int h);
// 5、单独设置窗口的高度
int height() const;
int minimumHeight() const;
int maximumHeight() const;
void setFixedHeight(int h);
void setMaximumHeight(int maxh);
void setMinimumHeight(int minh);
// 6、单独设置窗口的宽度
int width() const;
int minimumWidth() const;
int maximumWidth() const;
void setFixedWidth(int w);
void setMaximumWidth(int maxw);
void setMinimumWidth(int minw);
2.3 窗口标题、图标、资源文件
设置和获取窗口的标题,直接使用如下两个函数即可:
// 获取和设置窗口的标题
QString windowTitle() const;
void setWindowTitle(const QString &);
设置窗口的图标,需要一个 QIcon
对象,如下:
// 获取和设置窗口的图标
QIcon windowIcon() const;
void setWindowIcon(const QIcon &icon);
// 构造 QIcon 图标对象
// 有 6 个重载的构造方法,通常我们使用最后一个
// 参数为图标文件的路径
QIcon::QIcon(const QString &fileName);
首先将图标文件 clock.ico
,复制到项目目录 QWidgetTest
下的 icon
目录中,如下:
在项目上右键,选择【添加新文件…】
选择【Qt Resource File】,这样就会在项目中,添加一个 .qrc
的文件
资源文件命名为 main.qrc
点击完成就会在项目中,添加一个 main.qrc
的资源文件:
接下来打开 “资源文件编辑器”,如下:
注意:如果没有打开,直接右键 main.qrc
,然后选择 “Open in Editor
” 即可
然后,点击 “Add Prefix
”,添加前缀:
再点击 “Add Files
”,定位到拷贝到项目目录下的图标文件clock.ico
,最终效果如下:
接下来就可以拷贝这个 clock.ico
的资源路径,在程序中使用了
另外,QWidget
还有许多的槽函数:
其中以下的这些,在《1.5 标准信号槽》一节已经进行过讲解,这里不再演示。
// 最大化显示
void showMaximized();
// 最小化显示
void showMinimized();
// 正常显示
void showNormal();
// 关闭窗口
bool close();
3. 案例
下面使用一个案例,来演示 QWidget
中常用的方法:
核心代码如下:
void Widget::on_btnGetSize_clicked()
{
qDebug() << "---------------------------------";
QRect rect = this->geometry();
qDebug() << "左上角: " << rect.topLeft();
qDebug() << "右上角: " << rect.topRight();
qDebug() << "左下角: " << rect.bottomLeft();
qDebug() << "右下角: " << rect.bottomRight();
qDebug() << "宽度: " << rect.width();
qDebug() << "高度: " << rect.height();
}
void Widget::on_btnSetSize_clicked()
{
this->resize(400, 400);
}
void Widget::on_btnSetFixedSize_clicked()
{
this->setFixedSize(500, 500);
}
void Widget::on_btnSetMinSize_clicked()
{
this->setMinimumSize(300, 300);
}
void Widget::on_btnSetMaxSize_clicked()
{
this->setMaximumSize(600, 600);
}
void Widget::on_btnMove_clicked()
{
this->move(100, 100);
}
void Widget::on_btnSetTitle_clicked()
{
this->setWindowTitle("演示QWidget");
}
void Widget::on_btnSetIcon_clicked()
{
this->setWindowIcon(QIcon(":/icon/clock.ico"));
}
本节对应的视频讲解:B_站_链_接
https://www.bilibili.com/video/BV19B4y1s7YF