1.QWidget基本概念
- QWidget 类是所有窗口类的父类 (控件类是也属于窗口类),
- QWidget 类的父类的 QObject, 也就意味着所有的窗口类对象只要指定了父对象, 都可以实现内存资源的自动回收.
- 可以内嵌到其他窗口的内部,没有边框,需要指定父类窗口
- 可以作为独立的窗口显示,有边框,不需要指定父类窗口。
2.常用接口
2.1设置父对象
// 构造函数
QWidget::QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
// 公共成员函数
// 给当前窗口设置父对象
void QWidget::setParent(QWidget *parent);
void QWidget::setParent(QWidget *parent, Qt::WindowFlags f);
// 获取当前窗口的父对象, 没有父对象返回 nullptr
QWidget *QWidget::parentWidget() const;
。
2.2窗口位置
//------------- 窗口位置 -------------
// 得到相对于当前窗口父窗口的几何信息, 边框也被计算在内,标题栏和工具栏都属于边框
QRect QWidget::frameGeometry() const;
// 得到相对于当前窗口父窗口的几何信息, 不包括边框
const QRect &geometry() const;
// 设置当前窗口的几何信息(位置和尺寸信息), 不包括边框
void setGeometry(int x, int y, int w, int h);
void setGeometry(const QRect &);
// 移动窗口, 重新设置窗口的位置
void move(int x, int y);
void move(const QPoint &);
frameGeometry和geometry 获取的位置信息存储在 QRect中,QRect是是一个矩形类型。
QRect中常用的接口:
// 构造函数
// 构造一个空对象
QRect::QRect();
// 基于左上角坐标, 和右下角坐标构造一个矩形对象
QRect::QRect(const QPoint &topLeft, const QPoint &bottomRight);
// 基于左上角坐标, 和 宽度, 高度构造一个矩形对象
QRect::QRect(const QPoint &topLeft, const QSize &size);
// 通过 左上角坐标(x, y), 和 矩形尺寸(width, height) 构造一个矩形对象
QRect::QRect(int x, int y, int width, int height);
//返回矩形左边缘的左标
int x() const
//返回矩形上边缘的坐标
int y() const
//返回矩形的宽度
int width() const
//返回矩形的高度
int height() const
3.3qt中的坐标体系
3.4窗口的相对坐标
- 在一个 Qt 窗口中一般都有很多子窗口内嵌到这个父窗口中,其中每个窗口都有自己的坐标原点,子窗口的位置也就是其使用的坐标点就是它的父窗口坐标体系中的坐标点。
- 每个窗口都有坐标原点;
- 窗口的位置是基于父窗口的坐标体系来确定的,也就是说通过父窗口左上角的坐标点来确定自己的位置。
- Qt 中窗口显示的时候使用的相对坐标,相对于自己的父窗口
- B点的坐标相对于A点,即A点坐标为(0,0)
- C点的坐标相对于B点,即B点坐标为(0,0)
3.5 窗口尺寸
//获取窗口的大小
QSize size() const
// 重新设置窗口的尺寸信息
void resize(int w, int h);
void resize(const QSize &);
QSize是一个描述窗口大小的类型,包括长度和高度
// 构造函数
// 构造空对象, 对象中的宽和高都是无效的
QSize::QSize();
// 使用宽和高构造一个有效对象
QSize::QSize(int width, int height);
3.6 窗口标题
//------------- 窗口图标 -------------
// 得到当前窗口的图标
QIcon windowIcon() const;
// 构造图标对象, 参数为图片的路径
QIcon::QIcon(const QString &fileName);
// 设置当前窗口的图标
void setWindowIcon(const QIcon &icon);
//------------- 窗口标题 -------------
// 得到当前窗口的标题
QString windowTitle() const;
// 设置当前窗口的标题
void setWindowTitle(const QString &);
3.7 窗口信号
// QWidget::setContextMenuPolicy(Qt::ContextMenuPolicy policy);
// 窗口的右键菜单策略 contextMenuPolicy()
// 参数设置为 Qt::CustomContextMenu, 按下鼠标右键发射该信号
[signal] void QWidget::customContextMenuRequested(const QPoint &pos);
// 窗口图标发生变化, 发射此信号
[signal] void QWidget::windowIconChanged(const QIcon &icon);
// 窗口标题发生变化, 发射此信号
[signal] void QWidget::windowTitleChanged(const QString &title);
3.8 槽函数
// 关闭当前窗口
[slot] bool QWidget::close();
// 隐藏当前窗口
[slot] void QWidget::hide();
// 显示当前创建以及其子窗口
[slot] void QWidget::show();
//------------- 窗口状态 -------------
// 判断窗口是否可用
bool QWidget::isEnabled() const; // 非槽函数
// 设置窗口是否可用, 不可用窗口无法接收和处理窗口事件
// 参数true->可用, false->不可用
[slot] void QWidget::setEnabled(bool);
实战
基于窗口菜单实现策略:
在窗口点击鼠标右键就能生成一个菜单出来。如下
实现右键菜单窗口需要使用到如下这个函数:
// 函数原型:
void QWidget::setContextMenuPolicy(Qt::ContextMenuPolicy policy);
参数:
- Qt::NoContextMenu --> 不能实现右键菜单
- Qt::PreventContextMenu --> 不能实现右键菜单
- Qt::DefaultContextMenu --> 基于事件处理器函数 QWidget::contextMenuEvent() 实现
- Qt::ActionsContextMenu --> 添加到当前窗口中所有 QAction 都会作为右键菜单项显示出来
- Qt::CustomContextMenu --> 基于 QWidget::customContextMenuRequested() 信号实现
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<qwidget.h>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
resize(600,600);
ui->setupUi(this);
//设置窗口菜单策略
//在窗口右键点击,发出一个customContextMenuRequested信号
setContextMenuPolicy(Qt::CustomContextMenu);
connect(this,&QWidget::customContextMenuRequested,this,[=](){
QMenu menu;
//添加菜单
menu.addAction("c++");
menu.addAction("java");
menu.addAction("python");
//启动菜单栏
//QCursor::pos() 获取到鼠标点击的全局位置(屏幕的最左上方的坐标是(0,0)
menu.exec(QCursor::pos());
});
}