您的位置:首页 > 编程语言 > Qt开发

Qt 代码: 子窗口调用父窗口

2014-08-31 03:57 127 查看
 之前的 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. 获得父部件指针,同时需要类型强转.[/u]

ptr->setLineText("i can do it, too.");

close();

}



<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>

阅读(1) | 评论(0) | 转发(0) |

0
上一篇:Qt 代码: QMessageBox 用法

下一篇:Qt 代码: Qt布局与分割器QSplitter

相关热门文章
test123

编写安全代码——小心有符号数...

使用openssl api进行加密解密...

一段自己打印自己的c程序...

sql relay的c++接口

给主人留下些什么吧!~~

评论热议
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: