在QT中,我们时常会需要在主窗口里添加一些子窗口,比如添加一个新的对话框,或者在TabWidget中添加tab页面。通常添加子窗口后,如果在子窗口中做了一些操作,我们需要在主窗口中通过UI控件反映出来,但是由于ui对象是私有对象,所以一般的做法是使用QT中的信号槽机制,连接主窗口和子窗口对象,然后发送信号即可。

但是这种方法也有弊端,就是当我们在子窗口中有很多操作需要在主窗口中表现出来时,我们就需要建立很多的信号和槽,然后连接起来,可这样会很乱。可能过一段时间后再看这个程序,就忘记了这些信号和槽是做什么的,在哪连接的,让程序变的难以理解。所以,这里讲另一种方法,同样可以在子窗口中控制主窗口的UI控件。


效果


代码之路

这里使用的方法是传递主窗口的指针给子窗口,这样就可以使用这个指针调用主窗口类中的方法,主窗口类中方法中可以对ui控件进行操作。如果不是这种传指针的方法,而是直接new出主窗口的对象,即使调用了主窗口类的方法,在该方法中的对ui控件的操作也是没有效果的。

MainWindow.h

#include <QMainWindow>
#include "Dialog.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void UI_Open();void UI_Close();private slots:void on_Btn_OpenDialog_clicked();private:Ui::MainWindow *ui;Dialog *dlg_dialog;
};
#endif // MAINWINDOW_H

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_Btn_OpenDialog_clicked()
{// 这里创建子窗口,并把父窗口的指针传给子窗口dlg_dialog = new Dialog(this);dlg_dialog->setModal(true);dlg_dialog->show();
}void MainWindow::UI_Open()
{ui->Btn_Open->setEnabled(false);ui->Btn_Close->setEnabled(true);ui->statusbar->showMessage("开关已打开");
}void MainWindow::UI_Close()
{ui->Btn_Open->setEnabled(true);ui->Btn_Close->setEnabled(false);ui->statusbar->showMessage("开关已关闭");
}

Dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>// 两个类互相包含,在头文件中声明另一个类,在cpp文件中包含另一个类的头文件
class MainWindow;namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = nullptr);~Dialog();private slots:void on_Btn_Open_clicked();void on_Btn_Close_clicked();private:Ui::Dialog *ui;MainWindow *m_parent;              // 主窗口类的对象
};#endif // DIALOG_H

Dialog.cpp

#include "Dialog.h"
#include "ui_Dialog.h"
#include "MainWindow.h"// 主窗口类传来的this指针,QWidget *类型
Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);// 把传过来的父窗口类的指针强制类型转换m_parent = static_cast<MainWindow*>(parent);
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_Btn_Open_clicked()
{ui->Btn_Open->setEnabled(false);ui->Btn_Close->setEnabled(true);m_parent->UI_Open();
}void Dialog::on_Btn_Close_clicked()
{ui->Btn_Open->setEnabled(true);ui->Btn_Close->setEnabled(false);m_parent->UI_Close();
}

QT 在子窗口中调用主窗口的UI相关推荐

  1. window.open window.showModelDialog 打开一个新窗口/子窗口中调用父窗口的方法

    window.open 只打开一个窗口是将 oNewWindow   =   window   .   open   (   sURL   ,   sName   ,   sFeatures   , ...

  2. 在框架内用top.layer.open方式打开的子窗口中调用父窗口方法

    1.父窗口方法 function add() { //相关语句 } 2.父窗口打开子窗口 ,其他属性设置参考layer API top.layer.open({ id: "父窗口ID&quo ...

  3. 怎么从弹出窗口中往主窗口返回值?

    弹出窗口中: <script> window.οnlοad=function(){ opener.document.all.obj.value=返回的值 } </script>

  4. python 如何做密码对话框_Python GUI教程(八):在主窗口中调用对话框

    本篇将会介绍: 使用qt设计师创建两个窗口 转换设计师UI代码为Python代码 从主窗口中调用对话框窗口 一.创建两个窗口 根据本篇的最终目标--在主窗口中调用对话窗口,我们先使用qt设计师创建两个 ...

  5. qt获取窗口的右上角位置_如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置...

    用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主 ...

  6. QT学习笔记(六)——QT弹出对话框并在主窗口调用对话框的信息

    QT弹出对话框并在主窗口调用对话框的信息,显示影像 最近封控,大部分时间都在自己学习写代码,有点feel 了哈,自己摸出来一个简单的qt 界面,也实现了自己想要的功能.本篇博客主要记录一下,如何弹出对 ...

  7. 【Qt】弹出子窗口时禁用主窗口

    子窗口名:userManagerDialog Qt::WindowFlags flags = Qt::Dialog;userManagerDialog->setWindowFlags(flags ...

  8. Qt应用程序主窗口之一:主窗口框架

    对于日常见到的应用程序而言,许多都是基于主窗口的,主窗口中包含了菜单栏.工具栏.状态栏和中心区域等.这一章会详细介绍主窗口的每一个部分,还会涉及资源管理.富文本处理.拖放操作和文档打印等相关内容.重点 ...

  9. Android开发中调用系统窗口的方法

    //直接拨号 Intent callIntent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678")); start ...

最新文章

  1. Spring boot访问静态资源
  2. sap百分数表示Demo
  3. 第二次作业+105032014101
  4. com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.184.1 access service com.foreveross.syst
  5. 两种排序方法(直接判断)
  6. 使用php第三方包mpdf将网页装换成pdf文件【2】
  7. 分享15款堪称神器却鲜为人知的软件和网站
  8. Mongodb下载、安装、配置与使用
  9. 计算机网络技术摘要,计算机网络论文摘要
  10. 十分钟玩转3D绘图:WxGL完全手册(第二版)
  11. UniCode编码表,过滤不可见特殊字符
  12. 第一章:python入门储备知识
  13. QNAP(威联通)联合创始人郭博达先生一行到访
  14. java123456
  15. bad SQL grammer []; nested exception is java.sql.SQLSyntaxErrorException:ORA-00918:未明确定义列
  16. 适合程序员的耳机_有没有适合程序员打代码时用的耳机推荐?
  17. 最小二乘法在飞思卡尔智能车路径搜索中的应用
  18. Android View的工作流程(二) measure过程
  19. PHP API接口实例
  20. #4 大愚瞎说:碎片化

热门文章

  1. Linux学习:Linux 文件与目录管理
  2. pyqt5 基础创建窗口,点击按钮,打开浏览器
  3. Android Q 暗黑模式
  4. yyyyMMddHHmmss转yyyy-MM-dd HH:mm:ss格式
  5. pycharm如何刷新项目文件
  6. 第十三讲:目标设定面对压力 第十四讲:压力完美主义 第十五讲:完美主义
  7. stm32-HAL使用stop模式后DMA初始化的问题
  8. 项目需求分析定义的灵魂拷问
  9. 日语python_自学Python,英语,日语系列
  10. 获取日期(昨天、今天、本周第一天和最后一天、本月第一天和最后一天、本年第一天和最后一天)