• Qt 代码: 子窗口调用父窗口(其实就是用指针直接访问)


     之前的 Qt 编程大多只涉及简单的多窗口,并未染指窗口间的传值交互,想来还是“涉世未深”,对 Qt 的理解、应用还需殷勤努力。


    这次的问题是这样的,我想要实现一个类似QQ、阿里旺旺的聊天客户端,在弹出表情对话框后,能够选择表情并返回给聊天窗口的消息输入框,这就需要两个窗口之间的传值交互。
     
    首先想到的解决方法自然是使用Qt自带的signal/slot机制。即首先发信号给父窗口,父窗口接到信号执行槽函数发送一个携带所需数据的信号给子窗口。但是疑问来了:要在子窗口中接收到父窗口的信号必须进行signal和slot的绑定。这需要主窗口类的定义(1)。担心头文件的递归包含,我们只好再想另外一个方法。直接在子窗口中利用指向父窗口的指针来访问父窗口类的成员怎么样?
     
    说做就做,先写一个测试代码来试试。
     
    mainwindow.ui 中有一个lineedit和pushbutton,点击之后弹出Dialog实例;dialog.ui 中有一个pushbutton,点击之后修改mainwindow中的lineedit的文本内容。
     
    代码如下:
     
    (1) mainwindow.h
    #ifndef MAINWINDOW_H
    
    #define MAINWINDOW_H
    
    
    #include <QMainWindow>
    
    
    namespace Ui {
    
    class MainWindow;
    
    }
    
    
    
    class MainWindow : public QMainWindow
    {
    
     Q_OBJECT
    
    
    public:
    
     explicit MainWindow(QWidget *parent = 0);
    
    
    
     ~MainWindow();
    
    
    
     void setLineText(QString str);
    
    
    
    private slots:
    
     void on_pushButton_clicked();
    
    
    
    private:
    
     Ui::MainWindow *ui;
    
    };
    
    
    
    #endif // MAINWINDOW_H
    
    
     
     
    (2) mainwindow.cpp
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "dialog.h"
    #include "ui_dialog.h"
    
    
    MainWindow::MainWindow(QWidget *parent) :
    
     QMainWindow(parent),
    
     ui(new Ui::MainWindow)
    
    {
    
     ui->setupUi(this);
    
    }
    
    
    
    MainWindow::~MainWindow()
    
    {
    
     delete ui;
    
    }
    
    
    
    void MainWindow::on_pushButton_clicked()
    
    {
    
     Dialog subwin(this); //"this" is very important.
     subwin.setGeometry(x()-100, y()+100, wifth()-100, height()-100);
    
     subwin.exec(); //needed.
    }
    
    
    
    void MainWindow::setLineText(QString str)
    
    {
    
     ui->lineEdit->setText(str);
    
    }
    
    
    
     
    (3) dialog.h
    #ifndef DIALOG_H
    
    #define DIALOG_H
    
    
    #include <QDialog>
    
    
    namespace Ui {
    
    class Dialog;
    
    }
    
    
    
    class Dialog : public QDialog
    {
    
     Q_OBJECT
    
    
    public:
    
     explicit Dialog(QWidget *parent = 0);
    
    
    
     ~Dialog();
    
    
    
    private slots:
    
     void on_pushButton_clicked();
    
    
    
    private:
    
     Ui::Dialog *ui;
    
    };
    
    
    
    #endif // DIALOG_H
    
    
     
    (4) dialog.cpp
    #include "dialog.h"
    #include "ui_dialog.h"
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    
    Dialog::Dialog(QWidget *parent) :
    
     QDialog(parent),
    
     ui(new Ui::Dialog)
    
    {
    
     ui->setupUi(this);
    
    }
    
    
    
    Dialog::~Dialog()
    
    {
    
     delete ui;
    
    }
    
    
    
    void Dialog::on_pushButton_clicked()
    
    {
    
     MainWindow *ptr = (MainWindow*)parentWidget();  //"parentWidget" very important. 获得父部件指针,同时需要类型强转.
     ptr->setLineText("i can do it, too.");
    
     close();
    
    }

    http://blog.csdn.net/jan5_reyn/article/details/38955707

  • 相关阅读:
    这个夏天,感动我的歌,感动我的你
    设计中最困难的部分在于决定要设计什么 设计原本择录
    Sql效能优化总结(续) sql语句优化篇
    sql效能优化总结
    使用AStyle进行代码格式化
    迭代模型 转
    软件项目开发系列开篇杂谈
    Sql效能优化总结(续) 架构调整篇
    throw和throw ex的区别
    面向过程&面向对象 UML&RUP
  • 原文地址:https://www.cnblogs.com/findumars/p/5574280.html
Copyright © 2020-2023  润新知