2013-07-17 49 views
1

我已經在MainWindow.cpp中實例化了一個widgetClass。我想把「this」傳遞給這個小部件,不僅僅是(QWidget * parent)還有(MainWindow * parent)。但在構建中,widgetClass在MainWindow之前建立,因此它出錯。QWidget如何獲得「整個」父項?

我想要在MainWindow中獲取instanceVariables?

即:

myWidget(QWidget* parent, MainWindow* parent); 
+0

我不確定我的理解是否正確,請重新解釋一下問題,如果我沒有,但我認爲你需要QMainWidndow派生類的setCentralWidget成員函數:http://qt-project.org/ DOC/QT-5.0/qtwidgets/QMainWindow的。html#setCentralWidget,QMainWindow已經有一個佈局,這就是爲什麼你需要把你的部件作爲中央部件。 – Zlatomir

+0

在另一種情況下(您提到的有關訪問mainwindow功能的內​​容),您不需要傳遞MainWindow指針,只需要在MainWindow和widgetClass中爲您需要的功能編寫代碼信號和插槽,然後連接它們即可。 – Zlatomir

回答

1

上有這樣的任務的一些問題..也許問題是,你必須使用Forward Declaration包括在一個其他包括第一批..或者,也許事實一類QWidget的默認構造函數具有第一個參數作爲默認參數..您的錯誤究竟是什麼?

不管怎麼說,這是一個完整的例子:

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include "mywidget.h" 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    int foo(int n); 
private: 
    Ui::MainWindow *ui; 

    MyWidget *w; 
}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <iostream> 
MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    w = new MyWidget(this); 
    this->setCentralWidget(w); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

int MainWindow::foo(int n) 
{ 
    std::cout << "foo" << std::endl; 
    return n+42; 
} 

mywidget.h

#ifndef MYWIDGET_H 
#define MYWIDGET_H 

#include <QWidget> 

class MainWindow; 

class MyWidget : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit MyWidget(MainWindow *main, QWidget *parent = 0); 
signals: 
public slots: 
}; 

#endif // MYWIDGET_H 

mywidget.cpp

#include "mywidget.h" 
#include "mainwindow.h" 
#include <iostream> 

MyWidget::MyWidget(MainWindow *main, QWidget *parent) : 
    QWidget(parent) 
{ 
    std::cout << main->foo(0) << std::endl; 
} 

這有幫助嗎?

+0

不知道MyWidget在父級中傳遞的位置?其餘的似乎流動。 – jdl

+0

在MyWindget中,您將MainWindow引用爲* main,並且您可以調用MainWindow('foo')的特定方法。在MainWindow中,你有一個MyWidget作爲* q的實例。Parent沒有真正感動,它是由'setCentralWidget'自動設置的。 – nkint

+0

它有幫助,謝謝 – ehijon

1

answer proposed by nkint是最乾淨的方法。然而,存在着快速的黑客,如果你沒有時間或不能改變你的軟件的體系結構:

如果您肯定知道說的MyWidget父是QMainWindow,你可以簡單地做:

MyWidget::MyWidget(QWidget *parent) : 
    QWidget(parent) 
{ 
    QMainWindow * main = static_cast<QMainWindow*>(parent); 
    std::cout << main->foo(0) << std::endl; 
} 

如果你不能確定,即可能會或可能不會實際上是一個QMainWindow,那麼你可以做:

MyWidget::MyWidget(QWidget *parent) : 
    QWidget(parent) 
{ 
    QMainWindow * main = qobject_cast<QMainWindow*>(parent); 
    // here, main is null if and only if parent was not a QMainWindow 
    if(main) 
     std::cout << main->foo(0) << std::endl; 
} 

qobject_cast類似於dynamic_cast。更確切地說,該文件說:

的qobject_cast()函數的行爲類似於標準C++的dynamic_cast(),有以下優點:它不需要RTTI的支持,它可以跨動態庫邊界。

qobject_cast()也可以與接口一起使用;有關詳細信息,請參閱插件&塗料示例。

警告:如果T未用Q_OBJECT宏聲明,則此函數的返回值未定義。