• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
sn-genuine
博客园    首页    新随笔    联系   管理    订阅  订阅

Qt窗口类 QWidget 常用API

Qt窗口类 QWidget 常用API

1.继承关系

QWidget是所有窗口、控件的基类,继承自QObject与QPaintDevice。

  • 指定parent父对象,利用Qt对象树,内存自动回收。
  1. 有父对象:作为控件,内嵌到父窗口内部,无边框
  2. 无父对象:作为独立顶层窗口,带系统边框

子类:

  • 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());
});

面试背诵重点

  1. QWidget:有parent则是控件;无parent则是独立顶层窗口。
  2. 对象树机制:给控件指定parent,堆内存自动释放,不用手动delete。
  3. frameGeometry():包含标题栏边框;geometry()客户区不含边框。
  4. setFixedSize():窗口禁止拖拽缩放。
  5. 右键菜单:必须设置setContextMenuPolicy(Qt::CustomContextMenu),才会发射customContextMenuRequested信号。

坑:Windows系统不同缩放比例,frameGeometry拿到的坐标会受DPI缩放影响。

posted on 2026-08-30 21:20  SobNov  阅读(4)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3