Qt窗口类 QWidget 常用API
Qt窗口类 QWidget 常用API
1.继承关系
QWidget是所有窗口、控件的基类,继承自QObject与QPaintDevice。
- 指定
parent父对象,利用Qt对象树,内存自动回收。
- 有父对象:作为控件,内嵌到父窗口内部,无边框
- 无父对象:作为独立顶层窗口,带系统边框
子类:
QDialog:对话框窗口QMainWindow:主窗口(菜单栏、工具栏、状态栏)- 各类控件:
QPushButton、QLabel等
//构造函数
QWidget::QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
2.父对象相关API
//设置父对象
void setParent(QWidget *parent);
void setParent(QWidget *parent, Qt::WindowFlags f);
//获取父窗口,没有返回nullptr
QWidget *parentWidget() const;
3.窗口位置与几何信息
面试重点区分:
frameGeometry():整个窗口,包含标题栏、外边框,屏幕坐标系geometry():客户区,不包含标题栏和边框
//带边框完整窗口矩形
QRect frameGeometry() const;
//客户区(不含边框)
const QRect &geometry() const;
//设置客户区位置大小,不包含边框
void setGeometry(int x, int y, int w, int h);
void setGeometry(const QRect &);
//移动窗口(操作整个窗口frameGeometry)
void move(int x, int y);
void move(const QPoint &);
示例:移动窗口
void MainWindow::on_moveBtn_clicked()
{
QRect rect = this->frameGeometry();
move(rect.topLeft()+QPoint(10,20));
}
示例:打印窗口四点坐标
void MainWindow::on_positionBtn_clicked()
{
QRect rect = this->frameGeometry();
qDebug()<<"左上角:"<<rect.topLeft()<<'\n'
<<"右上角:"<<rect.topRight()<<'\n'
<<"左下角:"<<rect.bottomLeft()<<'\n'
<<"右下角:"<<rect.bottomRight()<<'\n'
<<"宽度:"<<rect.width()<<'\n'
<<"高度:"<<rect.height()<<'\n';
}
示例:setGeometry修改位置尺寸
void MainWindow::on_geometryBtn_clicked()
{
int x = 100 + rand() % 500;
int y = 100 + rand() % 500;
int width = this->width()+10;
int height = this->height()+10;
setGeometry(x,y,width,height);
}
4.窗口尺寸API
//获取当前客户区尺寸
QSize size() const;
//修改窗口大小
void resize(int w, int h);
void resize(const QSize &);
//固定窗口大小,用户不能拖拽缩放
void setFixedSize(const QSize &);
void setFixedSize(int w, int h);
//最大、最小尺寸限制
void setMaximumSize(const QSize &);
void setMaximumSize(int maxw, int maxh);
void setMinimumSize(const QSize &);
void setMinimumSize(int minw, int minh);
//单独设置高、宽
int height() const;
int width() const;
void setFixedHeight(int h);
void setMaximumHeight(int maxh);
void setMinimumHeight(int minh);
示例:固定窗口大小
setFixedSize(400,400);
5.窗口显示状态
//最大化
[slot] void showMaximized();
//最小化
[slot] void showMinimized();
//恢复正常大小
[slot] void showNormal();
6.窗口标题、图标
setWindowTitle("你好,世界");
setWindowIcon(QIcon("图片路径"));
void MainWindow::on_modifyBtn_clicked()
{
setWindowTitle("你好,世界");
setWindowIcon(QIcon("C:\\xxx\\xxx.png"));
}
7.QWidget信号
//右键菜单信号,需要设置策略 Qt::CustomContextMenu
[signal] void customContextMenuRequested(const QPoint &pos);
//窗口图标改变
[signal] void windowIconChanged(const QIcon &icon);
//窗口标题改变
[signal] void windowTitleChanged(const QString &title);
示例:右键弹出菜单
//设置右键菜单策略
setContextMenuPolicy(Qt::CustomContextMenu);
connect(this,&MainWindow::customContextMenuRequested,this,[=](const QPoint &pos){
QMenu menu;
menu.addAction("西红柿");
menu.addAction("黄瓜");
menu.addAction("茄子");
//在鼠标光标位置弹出菜单
menu.exec(QCursor::pos());
});
面试背诵重点
QWidget:有parent则是控件;无parent则是独立顶层窗口。- 对象树机制:给控件指定parent,堆内存自动释放,不用手动delete。
frameGeometry():包含标题栏边框;geometry()客户区不含边框。setFixedSize():窗口禁止拖拽缩放。- 右键菜单:必须设置
setContextMenuPolicy(Qt::CustomContextMenu),才会发射customContextMenuRequested信号。
坑:Windows系统不同缩放比例,frameGeometry拿到的坐标会受DPI缩放影响。
浙公网安备 33010602011771号