1

我在 MainWindow.cpp 中实例化了一个 widgetClass。我想将“this”传递给这个小部件,不仅仅是(QWidget* 父级),还有(MainWindow* 父级)。但是在构建时,widgetClass 是在 MainWindow 之前建立的,因此它会出错。

我想访问 MainWindow 中的 instanceVariables 吗?

IE:

myWidget(QWidget* parent, MainWindow* parent);
4

2 回答 2

1

这样的任务有一些问题..也许问题是你必须使用前向声明来包含一个包含第一个类的类..或者默认构造函数的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;
}

这有帮助吗?

于 2013-07-17T21:16:09.760 回答
1

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 宏声明,则此函数的返回值未定义。

于 2013-07-18T02:23:57.287 回答