赞
踩
像这个问题,我有几个似乎不合理的想法,其中包含:1、子窗口引入主窗口的头文件,并实例化主窗口指针,利用主窗口的指针进行调用主窗口的控件。2、子窗口不仅继承它本身的窗口类,还继承了主窗口类,这样就可以使用父类(主窗口类)的控件了,这个方法的前提是需要把主窗口的UI设置为公有(默认为私有)。当然,身为菜鸡的我没能实现...(但此文章会不断更新,将其他能实现此功能的方法都慢慢总结起来)
下面使用了其他的方法,实现了该功能。
主窗口包括:一个TextEdit、一个PushButton
子窗口包括:两个PushButton(发送和撤回)
功能:(子窗口Button调用主窗口TextEdit)
第一步:首先给主窗口的Button“打开链接”添加一个槽函数,让它能显示出子窗口,所以,我们需要声明一个子窗口类的指针,想要子窗口类的指针就必然要引入子窗口类的头文件。
//mianwindow.h
- #include "dialog.h" //引入子窗口类头文件
-
- private:
- Ui::MainWindow *ui;
- Dialog *dialog; //声明一个子窗口类指针
-
- };
第二步:在.cpp文件中实例化这个子窗口类指针,并利用这个指针来显示子窗口。
//mianwindow.cpp
- dialog = new Dialog(this,ui); //这里传递了两个参数,this和ui
- //ui指针是构造函数中传递的ui::(new Ui::MainWindow)
- //将ui指针传递给子窗口类的构造函数了,这样子窗口类的对象就可以访问主窗口类的控件了
- void MainWindow::on_openButton_clicked()
- {
- dialog->exec(); //exec()函数是默认模态的
- }
第三步:在第二步中,我们需要把Ui::MainWindow指针传递给子窗口类,所以,我们需要在子窗口类中(更准确地说在子窗口的头文件中,因为我们要更改子窗口类的构造函数,使它能够接受传进来的ui)引入Ui::MainWindow的头文件(因为控件指针在此声明的),并声明一个Ui::MainWindow的指针。
//dialog.h
#include "ui_mainwindow.h" //引入Ui::MainWindow类的头文件
- public:
- explicit Dialog(QWidget *parent = nullptr,Ui::MainWindow *mainWindowUi = nullptr);
- //在声明构造函数这里增加一个Ui::MainWindow指针类型参数
-
- private:
- Ui::Dialog *ui;
- Ui::MainWindow *mainWindowUi ; //并在此声明该指针
- };
第四步:在第三步中,我们只是在声明处更改了构造函数,接下来要在实现构造函数的地方也要进行相应的更改。
//dialog.cpp
- Dialog::Dialog(QWidget *parent,Ui::MainWindow *mainWindowUi) :
- QDialog(parent), // ↑ 对应更改构造函数
- ui(new Ui::Dialog),
- mainWindowUi(mainWindowUi) //传递参数
- {
- ui->setupUi(this);
- }
第五步:经过第四步的传参,此时利用Ui::MainWindow类型的mainWinddowUi指针就可以调用这里面的控件了。
//dialog.cpp
- void Dialog::on_yesButton_clicked()
- {
- mainWindowUi->textEdit->append("连接正常!"); // 访问MainWindow的textEdit控件
- }
-
-
- void Dialog::on_noButton_clicked()
- {
- mainWindowUi->textEdit->append("断开连接!"); // 访问MainWindow的textEdit控件
- }
- //mainwindow.h
- #ifndef MAINWINDOW_H
- #define 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();
-
- private slots:
- void on_openButton_clicked();
-
- private:
- Ui::MainWindow *ui;
- Dialog *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);
- dialog = new Dialog(this,ui); // 这里传递的是 Ui::MainWindow 类型的指针
- //这行代码将 Ui::MainWindow 类型的指针 ui 传递给了 Dialog 类的构造函数,
- //这样 Dialog 对象就可以访问 MainWindow 中的控件了。
-
- }
-
- MainWindow::~MainWindow()
- {
- delete ui;
- }
-
-
- void MainWindow::on_openButton_clicked()
- {
- dialog->exec();
- }
- //dialog.h
- #ifndef DIALOG_H
- #define DIALOG_H
-
- #include <QDialog>
- #include "ui_mainwindow.h"
-
- namespace Ui {
- class Dialog;
- }
-
- class Dialog : public QDialog
- {
- Q_OBJECT
-
- public:
- explicit Dialog(QWidget *parent = nullptr,Ui::MainWindow *mainWindowUi = nullptr);
- ~Dialog();
-
- private slots:
- void on_yesButton_clicked();
-
- void on_noButton_clicked();
-
- private:
- Ui::Dialog *ui;
- Ui::MainWindow *mainWindowUi ;
- };
-
- #endif // DIALOG_H
- //dialog.cpp
- #include "dialog.h"
- #include "ui_dialog.h"
- #include <QDebug>
-
- Dialog::Dialog(QWidget *parent,Ui::MainWindow *mainWindowUi) :
- QDialog(parent),
- ui(new Ui::Dialog),
- mainWindowUi(mainWindowUi)
- {
- ui->setupUi(this);
- }
-
- Dialog::~Dialog()
- {
- delete ui;
- }
-
- void Dialog::on_yesButton_clicked()
- {
- mainWindowUi->textEdit->append("连接正常!"); // 访问MainWindow的textEdit控件
- }
-
-
- void Dialog::on_noButton_clicked()
- {
- mainWindowUi->textEdit->append("断开连接!"); // 访问MainWindow的textEdit控件
- }
最后效果图展示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。