当前位置:   article > 正文

QT小程序--天气预报桌面小程序(如何在主窗口调用子窗口,并实现子窗口调用主窗口的控件)_qt主窗口调用子窗口函数

qt主窗口调用子窗口函数

        像这个问题,我有几个似乎不合理的想法,其中包含:1、子窗口引入主窗口的头文件,并实例化主窗口指针,利用主窗口的指针进行调用主窗口的控件。2、子窗口不仅继承它本身的窗口类,还继承了主窗口类,这样就可以使用父类(主窗口类)的控件了,这个方法的前提是需要把主窗口的UI设置为公有(默认为私有)。当然,身为菜鸡的我没能实现...(但此文章会不断更新,将其他能实现此功能的方法都慢慢总结起来)

        下面使用了其他的方法,实现了该功能。

一:先看看效果图,和功能逻辑。

主窗口包括:一个TextEdit、一个PushButton

子窗口包括:两个PushButton(发送和撤回)

功能:(子窗口Button调用主窗口TextEdit)

  • 主窗口点击“打开链接”---->子窗口弹出---->子窗口点击“发送”---->主窗口TextEdit显示“连接成功!”
  • 主窗口点击“打开链接”---->子窗口弹出---->子窗口点击“撤回”---->主窗口TextEdit显示“断开连接!”

二:逻辑

第一步:首先给主窗口的Button“打开链接”添加一个槽函数,让它能显示出子窗口,所以,我们需要声明一个子窗口类的指针,想要子窗口类的指针就必然要引入子窗口类的头文件。

//mianwindow.h

  1. #include "dialog.h" //引入子窗口类头文件
  2. private:
  3. Ui::MainWindow *ui;
  4. Dialog *dialog; //声明一个子窗口类指针
  5. };

第二步:在.cpp文件中实例化这个子窗口类指针,并利用这个指针来显示子窗口。

//mianwindow.cpp

  1. dialog = new Dialog(this,ui); //这里传递了两个参数,this和ui
  2. //ui指针是构造函数中传递的ui::(new Ui::MainWindow)
  3. //将ui指针传递给子窗口类的构造函数了,这样子窗口类的对象就可以访问主窗口类的控件了
  1. void MainWindow::on_openButton_clicked()
  2. {
  3. dialog->exec(); //exec()函数是默认模态的
  4. }

第三步:在第二步中,我们需要把Ui::MainWindow指针传递给子窗口类,所以,我们需要在子窗口类中(更准确地说在子窗口的头文件中,因为我们要更改子窗口类的构造函数,使它能够接受传进来的ui)引入Ui::MainWindow的头文件(因为控件指针在此声明的),并声明一个Ui::MainWindow的指针。

//dialog.h

#include "ui_mainwindow.h"              //引入Ui::MainWindow类的头文件
  1. public:
  2. explicit Dialog(QWidget *parent = nullptr,Ui::MainWindow *mainWindowUi = nullptr);
  3. //在声明构造函数这里增加一个Ui::MainWindow指针类型参数
  4. private:
  5. Ui::Dialog *ui;
  6. Ui::MainWindow *mainWindowUi ; //并在此声明该指针
  7. };

第四步:在第三步中,我们只是在声明处更改了构造函数,接下来要在实现构造函数的地方也要进行相应的更改。

//dialog.cpp

  1. Dialog::Dialog(QWidget *parent,Ui::MainWindow *mainWindowUi) :
  2. QDialog(parent), // ↑ 对应更改构造函数
  3. ui(new Ui::Dialog),
  4. mainWindowUi(mainWindowUi) //传递参数
  5. {
  6. ui->setupUi(this);
  7. }

第五步:经过第四步的传参,此时利用Ui::MainWindow类型的mainWinddowUi指针就可以调用这里面的控件了。

//dialog.cpp

  1. void Dialog::on_yesButton_clicked()
  2. {
  3. mainWindowUi->textEdit->append("连接正常!"); // 访问MainWindow的textEdit控件
  4. }
  5. void Dialog::on_noButton_clicked()
  6. {
  7. mainWindowUi->textEdit->append("断开连接!"); // 访问MainWindow的textEdit控件
  8. }

三:给出完整代码

  1. //mainwindow.h
  2. #ifndef MAINWINDOW_H
  3. #define MAINWINDOW_H
  4. #include <QMainWindow>
  5. #include "dialog.h"
  6. QT_BEGIN_NAMESPACE
  7. namespace Ui { class MainWindow; }
  8. QT_END_NAMESPACE
  9. class MainWindow : public QMainWindow
  10. {
  11. Q_OBJECT
  12. public:
  13. MainWindow(QWidget *parent = nullptr);
  14. ~MainWindow();
  15. private slots:
  16. void on_openButton_clicked();
  17. private:
  18. Ui::MainWindow *ui;
  19. Dialog *dialog;
  20. };
  21. #endif // MAINWINDOW_H
  1. //mainwindow.cpp
  2. #include "mainwindow.h"
  3. #include "ui_mainwindow.h"
  4. MainWindow::MainWindow(QWidget *parent)
  5. : QMainWindow(parent)
  6. , ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. dialog = new Dialog(this,ui); // 这里传递的是 Ui::MainWindow 类型的指针
  10. //这行代码将 Ui::MainWindow 类型的指针 ui 传递给了 Dialog 类的构造函数,
  11. //这样 Dialog 对象就可以访问 MainWindow 中的控件了。
  12. }
  13. MainWindow::~MainWindow()
  14. {
  15. delete ui;
  16. }
  17. void MainWindow::on_openButton_clicked()
  18. {
  19. dialog->exec();
  20. }
  1. //dialog.h
  2. #ifndef DIALOG_H
  3. #define DIALOG_H
  4. #include <QDialog>
  5. #include "ui_mainwindow.h"
  6. namespace Ui {
  7. class Dialog;
  8. }
  9. class Dialog : public QDialog
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit Dialog(QWidget *parent = nullptr,Ui::MainWindow *mainWindowUi = nullptr);
  14. ~Dialog();
  15. private slots:
  16. void on_yesButton_clicked();
  17. void on_noButton_clicked();
  18. private:
  19. Ui::Dialog *ui;
  20. Ui::MainWindow *mainWindowUi ;
  21. };
  22. #endif // DIALOG_H
  1. //dialog.cpp
  2. #include "dialog.h"
  3. #include "ui_dialog.h"
  4. #include <QDebug>
  5. Dialog::Dialog(QWidget *parent,Ui::MainWindow *mainWindowUi) :
  6. QDialog(parent),
  7. ui(new Ui::Dialog),
  8. mainWindowUi(mainWindowUi)
  9. {
  10. ui->setupUi(this);
  11. }
  12. Dialog::~Dialog()
  13. {
  14. delete ui;
  15. }
  16. void Dialog::on_yesButton_clicked()
  17. {
  18. mainWindowUi->textEdit->append("连接正常!"); // 访问MainWindow的textEdit控件
  19. }
  20. void Dialog::on_noButton_clicked()
  21. {
  22. mainWindowUi->textEdit->append("断开连接!"); // 访问MainWindow的textEdit控件
  23. }

最后效果图展示:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/730733
推荐阅读
相关标签
  

闽ICP备14008679号