QT 在子窗口中调用主窗口的UI

在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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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_OBJECT

public:
    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窗口调用窗口函数可以通过信号与槽机制来实现。 首先,在子窗口定义一个需要被窗口调用的函数。例如,子窗口为ChildWindow,函数为childFunction()。 子窗口头文件ChildWindow.h添加以下代码: ```cpp signals: void callChildFunction(); public slots: void childFunction(); ``` 接下来,在窗口,需要实例化子窗口的对象,并连接子窗口的信号和窗口的槽函数。 窗口头文件MainWindow.h添加以下代码: ```cpp private slots: void onCallChildFunction(); ``` 窗口源文件MainWindow.cpp添加以下代码: ```cpp void MainWindow::onCallChildFunction() { childWindow->childFunction(); } ``` 最后,在窗口的构造函数,进行子窗口对象的创建,并连接信号与槽函数。 窗口源文件MainWindow.cpp添加以下代码: ```cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { // 其他代码... childWindow = new ChildWindow(this); connect(this, &MainWindow::callChildFunction, childWindow, &ChildWindow::childFunction); } ``` 这样,当窗口需要调用窗口的函数时,只需要在窗口的槽函数onCallChildFunction()发射信号emit callChildFunction()即可。 总结起来,窗口调用窗口函数的步骤如下: 1. 在子窗口定义需要被调用的函数。 2. 在窗口创建子窗口对象,并连接信号与槽函数。 3. 在窗口的槽函数发射子窗口的信号。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值