我已經在MainWindow.cpp中實例化了一個widgetClass。我想把「this」傳遞給這個小部件,不僅僅是(QWidget * parent)還有(MainWindow * parent)。但在構建中,widgetClass在MainWindow之前建立,因此它出錯。QWidget如何獲得「整個」父項?
我想要在MainWindow中獲取instanceVariables?
即:
myWidget(QWidget* parent, MainWindow* parent);
我已經在MainWindow.cpp中實例化了一個widgetClass。我想把「this」傳遞給這個小部件,不僅僅是(QWidget * parent)還有(MainWindow * parent)。但在構建中,widgetClass在MainWindow之前建立,因此它出錯。QWidget如何獲得「整個」父項?
我想要在MainWindow中獲取instanceVariables?
即:
myWidget(QWidget* parent, MainWindow* parent);
上有這樣的任務的一些問題..也許問題是,你必須使用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;
}
這有幫助嗎?
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宏聲明,則此函數的返回值未定義。
我不確定我的理解是否正確,請重新解釋一下問題,如果我沒有,但我認爲你需要QMainWidndow派生類的setCentralWidget成員函數:http://qt-project.org/ DOC/QT-5.0/qtwidgets/QMainWindow的。html#setCentralWidget,QMainWindow已經有一個佈局,這就是爲什麼你需要把你的部件作爲中央部件。 – Zlatomir
在另一種情況下(您提到的有關訪問mainwindow功能的內容),您不需要傳遞MainWindow指針,只需要在MainWindow和widgetClass中爲您需要的功能編寫代碼信號和插槽,然後連接它們即可。 – Zlatomir