mainwindow.h (主窗口类)
stat.h (子窗口类)
main.cpp (显示窗口,只有2行代码)
mainwindow.cpp(定义主窗口及控件,生成子窗口)
stat.cpp (定义子窗口及控件)
其中main.cpp最简单,就是创建并显示主窗口。
代码: 全选
#include <QApplication>
#include "mainwindow.h"
int main(int argc , char **argv)
{
QApplication app(argc,argv);
MainWindow *w = new MainWindow ;
w->show();
return app.exec();
}
在mainwindow.h里声明了一个主窗口要用到的控件。
代码: 全选
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui> //为了简洁明了直接上QtGui头文件,它包含所需要的一切相关类。
class MainWindow : public QMainWindow
{
Q_OBJECT
private slots:
void gen1(); //此函数是当用户点击主菜单里的项时,生成子窗口。
public:
QSpinBox *spinbox ;
//非相关的代码,如窗口布局等全部省略。
};
#endif // MAINWINDOW_H
在stat.h里声明子窗口,点击button后就可以刷新spinbox里的值了。
代码: 全选
#include "mainwindow.h"
#include <QtGui>
class genB1Dialog : public QDialog
{
Q_OBJECT
public:
genB1Dialog(QWidget *parent = 0);
void hookMainWindow(MainWindow *w) ; //创建一个函数,其参数是窗口指针
MainWindow *p ; //创建一个窗口指针
private:
QSpinBox *spinbox ;
QPushButton *button ;
signals:
void ToMainWindow( int );
private slots:
void monitor() ; //子窗口里的按钮点击后信号发送给此槽函数,然后函数内实现子窗口里的spinbox和主窗口里的spinbox数据同步
void updateToMainWindow_Spinbox(int) ;
};
在MainWindow.cpp中的代码是界面布局和生成子窗口。
代码: 全选
#include <QtGui>
#include "mainwindow.h"
#include "stat.h"
MainWindow::MainWindow(QWidget *parent):QMainWindow(parent)
{
//以下非相关的代码全部用//给注释掉了,只需记得主窗口里有一个QSpinbox,初使值为5
//createAct();
//createMenus();
//textEdit = new QTextEdit ;
spinbox = new QSpinBox ;
spinbox->setValue(5);
//QSplitter *main = new QSplitter(Qt::Vertical);
//main->addWidget(top);
// main->addWidget(bottom);
//setCentralWidget(main);
}
void MainWindow::gen1()
{
genF1Dialog *dlg = new genF1Dialog(this) ; //当点击主窗口菜单File下的creator项时,生成此子窗口,
......
//以上省略你要实现的代码,最关键的是下一行代码,把主窗口指针this通过hookMainWindow传给了dlg子窗口
dlg->hookMainWindow(this);
QObject::connect(dlg , SIGNAL(ToMainTable(int)) , this , SLOT(updateToMainWindow_Spinbox(int)) ;
dlg->show();
}
void MainWindow::updateToMainWindow_Spinbox(int a)
{
spinbox->setValue( a ) ;
}
在stat.cpp里是子窗口类的定义
代码: 全选
#include <QDialog>
#include "stat.h"
genF1Dialog::genF1Dialog(QWidget *parent) : QDialog(parent)
{
//以下非相关的代码全部用//给注释掉
spinbox = new QSpinBox(this) ;
spinbox->setValue(0);
button = new QPushButton("Update") ;
//QVBoxLayout *mainLayout = new QVBoxLayout ;
//mainLayout->addWidget(table);
//mainLayout->addWidget(spinbox);
//setLayout(mainLayout);
QObject::connect(button , SIGNAL(clicked()) , this , SLOT(monitor()) ) ; //创建按钮点击信号,并与函数monitor关联。
// resize(800,600);
}
void genF1Dialog::hookMainWindow(MainWindow *w)
{
p = w ; //让指针p指向主窗口
}
void genFDialog::monitor()
{
spinbox->setValue( p->spinbox->value() ) ; //把主窗口spinbox的数据传到此子窗口的spinbox里
}
最关键的是在void MainWindow::gen1()函数里用语句genF1Dialog *dlg = new genF1Dialog(this)生成子窗口后,再用语句dlg->hookMainWindow(this)把主窗口指针引给dlg子窗口。子窗口头文件stat.h里声明一个窗口指针MainWindow *p ,让它通过 stat.cpp里的void genF1Dialog::hookMainWindow(MainWindow *w)函数把主窗口指针赋给它。这时终于可以在dlg子窗口里通过指针p访问主窗口里的控件了。
反过来,如果我要把子窗口里spinbox的值传给主窗口呢?
那就简单一些了,只要在stat.h里定义一个信号:
signals:
void ToMainWindow( int ); //因为spinbox里的值是一个int型,所以信号里的参数也是int型。
即可。
在你想要传给主窗口的时候用语句:
emit ToMainWindow( spinbox->value() ) ;
发射了信号,接下来就要接收信号了,在mainwindow.cpp文件的void MainWindow::gen1()函数里添加语句:
QObject::connect(dlg , SIGNAL(ToMainTable(int)) , this , SLOT(updateToMainWindow_Spinbox(int)) ;
当然,updateToMainWindow_Spinbox(int)也要在mainwindow.h中声明一下。
最后在mainwindow.cpp中添加如下语句:
void MainWindow::updateToMainWindow_Spinbox(int a)
{
spinbox->setValue( a ) ; //把子窗口spinbox的数据传到主窗口的spinbox里
}
到这里工程就可以完工了。实现了双向通信。小小例子,浪费了我2个小时,希望能帮到有需要又没头绪的初学者。
[/code]