接着上一讲的软件项目,我们这个实例要实现Form2中被选中的表格数据,传递到Form1表格中显示,Qt的信号-槽非常灵活方便,但怎么用好它,每个程序员的设计是不一样的,本实例中如何实现多个类之间传递数据呢?
1、首先,把握一个原则,要想两个类之间能传递数据,必须先把这个两个类new出来;
2、用connect连接这两个类,在发送数据的类定义一个信号SIGNAL,在接收数据类中定义一个槽函数;
3、另外,传递数据经常用到结构体数据,在本实例的项目中,添加一个公共头文件l_global.h文件,在头文件中添加一个结构体如下:
struct ViewData { int schemeId; int serial; QString name; QString feature; int flag; }; Q_DECLARE_METATYPE(ViewData);
特别要注意的是:要在该结构体后面加上Q_DECLARE_METATYPE(ViewData);否则信号就不能把结构体类型的数据传递到槽函数中;
4、如上一讲的软件项目,在mainwindow.cpp类中,改写void MainWindow::on_actionPage1_triggered()槽函数,当鼠标点击工具栏的Page1时,new出Page1或者让Page1显示出来,代码如下:
void MainWindow::on_actionPage1_triggered() { if(mform1!=nullptr) { mform1->show(); } else { mform1 = new Form1; mform1->setObjectName("form1"); ui->gridLayout->addWidget(mform1); } if(mform2!=nullptr) { mform2->hide(); connect(mform2,SIGNAL(sendSig(QList<ViewData>)),mform1,SLOT(getData(QList<ViewData>))); } }
5、在mainwindow.cpp类中,改写void MainWindow::on_actionPage2_triggered
()槽函数,与步骤4同理的方法,代码如下:
void MainWindow::on_actionPage2_triggered() { if(mform2!=nullptr) { mform2->show(); } else { mform2 = new Form2; mform2->setObjectName("form2"); ui->gridLayout->addWidget(mform2); } if(mform1!=nullptr) { mform1->hide(); connect(mform2,SIGNAL(sendSig(QList<ViewData>)),mform1,SLOT(getData(QList<ViewData>))); } }
注意:只有当Page1和Page2类都new出来后,才能connect它们之间的信号-槽;
实例过程和效果如视频所示:在Page2添加了三条记录,勾选了第1、3条记录,点击按钮发送Page2的信号,勾选的数据以QList<ViewData>链表发送到Page1页面的表格中显示出来;