QWidget如何获得“整个”父母?

时间:2013-07-17 20:28:46

标签: c++ qt

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

我想在MainWindow中找到instanceVariables吗?

即:

myWidget(QWidget* parent, MainWindow* parent);

2 个答案:

答案 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_castdynamic_cast类似。更确切地说,文档说:

  

qobject_cast()函数的行为类似于标准C ++ dynamic_cast(),其优点是不需要RTTI支持,并且它可以跨动态库边界工作。

     

qobject_cast()也可以与接口一起使用;看看Plug&amp;绘制示例详细信息。

     

警告:如果未使用Q_OBJECT宏声明T,则此函数的返回值未定义。