之前的 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