我在 MainWindow.cpp 中实例化了一个 widgetClass。我想将“this”传递给这个小部件,不仅仅是(QWidget* 父级),还有(MainWindow* 父级)。但是在构建时,widgetClass 是在 MainWindow 之前建立的,因此它会出错。
我想访问 MainWindow 中的 instanceVariables 吗?
IE:
myWidget(QWidget* parent, MainWindow* parent);
这样的任务有一些问题..也许问题是你必须使用前向声明来包含一个包含第一个类的类..或者默认构造函数的QWidget
第一个参数作为默认参数的事实..你的错误到底是什么?
无论如何,这是一个完整的例子:
主窗口.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
主窗口.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;
}
我的小部件.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
我的小部件.cpp
#include "mywidget.h"
#include "mainwindow.h"
#include <iostream>
MyWidget::MyWidget(MainWindow *main, QWidget *parent) :
QWidget(parent)
{
std::cout << main->foo(0) << std::endl;
}
这有帮助吗?
nkint 提出的答案是最干净的方法。但是,如果您没有时间或无法更改软件的架构,则存在快速破解:
如果您确定的父母MyWidget
是 a QMainWindow
,您可以简单地执行以下操作:
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent)
{
QMainWindow * main = static_cast<QMainWindow*>(parent);
std::cout << main->foo(0) << std::endl;
}
如果您不确定,即实际上可能是也可能不是 a 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() 也可以和接口一起使用;有关详细信息,请参阅 Plug & Paint 示例。
警告:如果 T 未使用 Q_OBJECT 宏声明,则此函数的返回值未定义。