这里说的父窗口成员变量指的是含有自定义类型的变量,比如包含自定义结构/类的容器类(如QVector),对于父窗口中int、string等常规成员,可通过直接传地址的办法进行访问,不复杂。
例:父窗口(MainWindow)类中有成员变量QVector<TypeA> vect,TypeA是MainWindow中定义的结构体。
子窗口(Dialog1)需要访问vect中的元素。
-
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
-
- #include "ui_mainwindow.h"
- #include <QVector>
-
- class MainWindow : public QMainWindow, private Ui::MainWindow
- {
- Q_OBJECT
-
- public:
- explicit MainWindow(QWidget *parent = 0);
- struct TypeA{
- int id;
- QString name;
- };
-
- private:
- void addItem(int id, QString name);
- QVector<TypeA> vect;
-
- private slots:
- void on_viewDialog_clicked();
- };
-
- #endif // MAINWINDOW_H
-
- #include "mainwindow.h"
- #include "dialog1.h"
-
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent)
- {
- setupUi(this);
- addItem(100, "Tom");
- addItem(101, "Jerry");
- addItem(102, "Jack");
- }
-
- void MainWindow::addItem(int id, QString name)
- {
- TypeA item;
- item.id = id;
- item.name = name;
- vect.push_back(item);
- }
-
- void MainWindow::on_viewDialog_clicked()
- {
- Dialog1 *newDlg = new Dialog1(this);
- newDlg->updateTable();
-
- newDlg->show();
- newDlg->raise();
- newDlg->activateWindow();
- }
方法1:
在Dialog1中获取父窗口指针,通过指针直接访问成员vect,问题在于这时候vect需要设置为public才可访问。(类Dialog1没有继承类MainWindow)
-
- void Dialog1::updateTable()
- {
- MainWindow * p = (MainWindow*) parentWidget();
-
- int vSize = p->vect.size();
- for (int i = 0; i < vSize; i++){
- tableWidget->insertRow(i);
- tableWidget->setItem(i, 0, new QTableWidgetItem(QString::number(p->vect[i].id)));
- tableWidget->setItem(i, 1, new QTableWidgetItem(p->vect[i].name));
- }
- }
方法2:
通过传引用的方法在Dialog1中访问vect(如果不需要修改可传const引用)。这种情况下Dialog1中的updateTable函数需要加参数,对于mainwindow.h的include需要写在dialog1.h中,注意不要在dialog1.h中包含mainwindow.h的同时又在后者包含前者,会造成重复包含的问题。
此时在Mainwindow中,vect不必是public属性的,可以是private。
-
- void Dialog1::updateTable(const QVector<MainWindow::TypeA> &vect)
- {
- int vSize = vect.size();
- for (int i = 0; i < vSize; i++){
- tableWidget->insertRow(i);
- tableWidget->setItem(i, 0, new QTableWidgetItem(QString::number(vect[i].id)));
- tableWidget->setItem(i, 1, new QTableWidgetItem(vect[i].name));
- }
- }
方法3:
在MainWindow中增加一个public的成员函数来获取vect的指针,在Dialog1中调用此函数获取vect指针,再在Dialog1中进行操作。注意此时Dialog1中得到的不是引用而是指针,访问成员使用"->"而不是"."。
这种方法较好地实现了封装,将vect设为private可以防止不必要的访问。
-
- QVector<TypeA>* getVect(){return &vect;}
-
- void Dialog1::updateTable()
- {
- MainWindow * p = (MainWindow*) parentWidget();
- QVector<MainWindow::TypeA> *vect = p->getVect();
-
- int vSize = vect->size();
- for (int i = 0; i < vSize; i++){
- tableWidget->insertRow(i);
- tableWidget->setItem(i, 0, new QTableWidgetItem(QString::number(vect->at(i).id)));
- tableWidget->setItem(i, 1, new QTableWidgetItem(vect->at(i).name));
- }
- }
PS:方法1、3的时候注意创建Dialog1实例的时候将父窗口的指针传入。
转自:http://blog.csdn.net/marvel90/article/details/8852680
所有评论(0)