我在MainWindow.cpp中实例化了一个widgetClass。我想将“this”传递给这个小部件不仅仅是(QWidget * parent)而且还是(MainWindow * parent)。但是在构建时,widgetClass是在MainWindow之前建立的,因此它会出错。
我想在MainWindow中找到instanceVariables吗?
即:
myWidget(QWidget* parent, MainWindow* parent);
答案 0 :(得分:1)
这个任务有一些问题。也许问题是你必须使用Forward Declaration将一个类包含在另一个包含前几个的类中......或者可能是{{的默认构造函数1}}将第一个参数作为默认参数..你的错误究竟是什么?
无论如何,这是一个完整的例子:
mainwindow.h
QWidget
mainwindow.cpp
#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
mywidget.h
#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.cpp
#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
这有帮助吗?
答案 1 :(得分: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()也可以与接口一起使用;看看Plug&amp;绘制示例详细信息。
警告:如果未使用Q_OBJECT宏声明T,则此函数的返回值未定义。