qt5 添加子窗口

1.新建子窗口

选中工程->右键->新建文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
子窗口创建完成

2. 调用子窗口

添加相应的头文件
在这里插入图片描述

使用一个按键的槽函数即可打开子窗口

void Widget::on_CurtainInterference_pushButton_clicked()
{
    CurtainInterferencewindow *form = new CurtainInterferencewindow;
    form->show();
}
<think>我们正在使用Qt框架,具体是在MainWindow中添加窗口(可能是QWidget、QDialog或其他窗口类),并在该窗口中进行绘图操作。 步骤: 1. 创建窗口类(通常继承自QWidget)。 2. 在窗口类中重写paintEvent方法,使用QPainter进行绘图。 3. 在MainWindow中创建该窗口的实例,并设置其为主窗口窗口(通过setParent或创建时指定父对象),然后显示。 注意:在Qt中,绘图操作通常在paintEvent事件处理函数中进行,使用QPainter对象。 示例代码: 首先,我们创建一个自定义的窗口类(例如MySubWindow),继承自QWidget,并重写paintEvent方法。 然后,在MainWindow中,我们创建一个MySubWindow的实例,并将其放置在MainWindow的某个位置(例如使用布局或设置几何位置)。 下面是一个简单的实现示例: 文件:mysubwindow.h ```cpp #ifndef MYSUBWINDOW_H #define MYSUBWINDOW_H #include <QWidget> class MySubWindow : public QWidget { Q_OBJECT public: explicit MySubWindow(QWidget *parent = nullptr); protected: void paintEvent(QPaintEvent *event) override; }; #endif // MYSUBWINDOW_H ``` 文件:mysubwindow.cpp ```cpp #include "mysubwindow.h" #include <QPainter> MySubWindow::MySubWindow(QWidget *parent) : QWidget(parent) { // 可以设置一些属性,比如背景色 setAutoFillBackground(true); setPalette(Qt::white); } void MySubWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // 设置画笔和画刷 painter.setPen(QPen(Qt::blue, 2)); painter.setBrush(QBrush(Qt::green, Qt::SolidPattern)); // 绘制一个矩形 painter.drawRect(10, 10, 100, 100); // 绘制文本 painter.drawText(50, 50, "Hello, Qt!"); } ``` 文件:mainwindow.h ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "mysubwindow.h" class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: MySubWindow *subWindow; }; #endif // MAINWINDOW_H ``` 文件:mainwindow.cpp ```cpp #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // 设置主窗口大小 resize(800, 600); // 创建窗口,并指定父对象为主窗口 subWindow = new MySubWindow(this); // 设置窗口的位置和大小 subWindow->setGeometry(100, 100, 200, 200); // 显示窗口 subWindow->show(); } MainWindow::~MainWindow() { } ``` 这样,当主窗口显示时,窗口也会显示,并且在窗口中绘制一个蓝色的矩形框,内部填充绿色,并显示文本“Hello, Qt!”。 注意事项: - 确保在窗口的paintEvent中使用QPainter时,其作用域只在paintEvent函数内(即局部变量),因为QPainter必须在paintEvent中创建。 - 如果需要在主窗口的多个位置添加窗口,可以创建多个窗口实例。 - 也可以使用布局管理器来管理窗口的位置和大小。 相关问题: 1. 如何在Qt中实现更复杂的绘图(如曲线、图像)? 2. 如何实现窗口的交互(如鼠标事件)? 3. 如何更新窗口的绘图(重绘)? 如果需要,我们可以进一步讨论这些问题。</think>### Qt MainWindow 添加窗口并绘图 在Qt中,向`QMainWindow`添加窗口并在窗口绘图的核心步骤如下: #### 1. **创建自定义窗口类** ```cpp // 窗口头文件 PaintWidget.h #include <QWidget> #include <QPainter> class PaintWidget : public QWidget { Q_OBJECT public: explicit PaintWidget(QWidget *parent = nullptr); protected: void paintEvent(QPaintEvent *event) override; // 重写绘图事件 }; ``` ```cpp // 窗口实现 PaintWidget.cpp #include "PaintWidget.h" PaintWidget::PaintWidget(QWidget *parent) : QWidget(parent) { setFixedSize(400, 300); // 设置固定尺寸 } void PaintWidget::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // 绘制红色矩形边框 painter.setPen(QPen(Qt::red, 2)); painter.drawRect(rect().adjusted(10, 10, -10, -10)); // 绘制绿色圆形 painter.setBrush(Qt::green); painter.drawEllipse(50, 50, 100, 100); // 绘制蓝色文本 painter.setFont(QFont("Arial", 16)); painter.setPen(Qt::blue); painter.drawText(150, 150, "Qt Drawing"); } ``` #### 2. **在主窗口中集成窗口** ```cpp // 主窗口 MainWindow.cpp #include "MainWindow.h" #include "PaintWidget.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // 创建窗口实例 PaintWidget *paintWidget = new PaintWidget(this); // 设置为主窗口中心部件 setCentralWidget(paintWidget); setWindowTitle("MainWindow with Drawing"); resize(600, 500); } ``` #### 关键说明: 1. **绘图原理**: - 所有绘图操作在`paintEvent()`中实现 - 使用`QPainter`进行2D图形绘制 - 坐标系原点(0,0)在窗口左上角 2. **坐标系统**: - 水平向右为$x$轴正方向 - 垂直向下为$y$轴正方向 - 单位:像素 3. **常用绘图方法**: ```cpp painter.drawLine(x1, y1, x2, y2); // 直线 painter.drawRect(x, y, w, h); // 矩形 painter.drawEllipse(x, y, w, h); // 椭圆 painter.drawPolygon(points, n); // 多边形 ``` #### 3. **触发重绘** 需要更新绘图时调用: ```cpp update(); // 异步重绘(推荐) // 或 repaint(); // 立即重绘(慎用) ``` #### 效果: 主窗口将显示一个400×300的绘图区域,包含: - 红色矩形边框 - 绿色圆形 - 蓝色文本"Qt Drawing" [^1] --- ### 相关问题 1. 如何在Qt中实现动态实时绘图(如鼠标轨迹绘制)? 2. 怎样使用QGraphicsView进行高性能复杂绘图? 3. Qt绘图中的双缓冲技术如何实现? 4. 如何将绘制的图形保存为图片文件(PNG/JPEG)? 5. 在自定义绘图中如何处理高DPI屏幕的缩放问题? [^1]: Qt官方文档:QPainter Class, QWidget Class. Qt Documentation.
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值