Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QWidget如何获得;“全部”;父母亲_C++_Qt - Fatal编程技术网

C++ QWidget如何获得;“全部”;父母亲

C++ QWidget如何获得;“全部”;父母亲,c++,qt,C++,Qt,我在MainWindow.cpp中实例化了一个widgetClass。我想将“this”传递给这个小部件,不仅仅是作为(QWidget*父项)传递,还作为(MainWindow*父项)传递。但是在构建中,widgetClass是在主窗口之前建立的,因此它会出错 我想在主窗口中访问instanceVariables 即: 这项任务有一些问题。。也许问题在于,你必须使用一个类来包含另一个类,其中包括第一个类。。或者,QWidget的默认构造函数将第一个参数作为默认参数。。你的错误到底是什么 无论如何

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

我想在主窗口中访问instanceVariables

即:


这项任务有一些问题。。也许问题在于,你必须使用一个类来包含另一个类,其中包括第一个类。。或者,
QWidget
的默认构造函数将第一个参数作为默认参数。。你的错误到底是什么

无论如何,这里有一个完整的例子:

主窗口

#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
\ifndef主窗口
#定义主窗口
#包括
#包括“mywidget.h”
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
int foo(int n);
私人:
Ui::MainWindow*Ui;
MyWidget*w;
};
#endif//main窗口
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;
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
w=新的MyWidget(此);
此->设置中心Widget(w);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
int主窗口::foo(int n)
{
std::cout这是最干净的方法。但是,如果您没有时间或无法更改软件的体系结构,则存在快速黑客攻击:

如果您确实知道
MyWidget
的父窗口是
QMainWindow
,您只需执行以下操作:

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    QMainWindow * main = static_cast<QMainWindow*>(parent);
    std::cout << main->foo(0) << std::endl;
}
qobject\u cast
类似于
dynamic\u cast
。更准确地说,文档中说:

QObjutsCube()函数的行为类似于标准C++动态DycCype(),其优点是不需要RTTI支持,它可以跨动态库边界工作。 qobject_cast()还可以与接口结合使用;有关详细信息,请参见Plug&Paint示例

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


我不确定我是否理解正确,如果我没有理解,请重新表述这个问题,但我认为您需要QMainWindow派生类的setCentralWidget成员函数:,QMainWindow已经有一个布局,这就是为什么您需要将小部件作为centralWidget。在另一种情况下(您所说的关于访问主窗口功能的内容)您不需要传递MainWindow指针,只需为MainWindow和widgetClass中所需的功能编码信号和插槽,并将它们连接起来。不确定MyWidget在父级中传递到何处?其余部分似乎都在传递。在MyWindget中,您将MainWindow引用为*main,并且可以调用MainWindow的特定方法(
foo
)。在主窗口中,MyWidget的一个实例是*q..Parent并没有被真正触动,它是由
setCentralWidget
自动设置的。。
#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
#include "mywidget.h"
#include "mainwindow.h"
#include <iostream>

MyWidget::MyWidget(MainWindow *main, QWidget *parent) :
    QWidget(parent)
{
    std::cout << main->foo(0) << std::endl;
}
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    QMainWindow * main = static_cast<QMainWindow*>(parent);
    std::cout << main->foo(0) << std::endl;
}
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;
}