Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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
Qt4父指针用法_Qt_Qt4_Parent - Fatal编程技术网

Qt4父指针用法

Qt4父指针用法,qt,qt4,parent,Qt,Qt4,Parent,我在理解QT4中parent指针的用法时遇到了一些问题 class firstClass : public QWidget { Q_OBJECT public: firstClass(QWidget *parent = 0); ~firstClass(); void doSomething(); private: secondClass * myClass; }; class secondClass : public QWidget {

我在理解QT4中
parent
指针的用法时遇到了一些问题

class firstClass : public QWidget
{
    Q_OBJECT

public:
     firstClass(QWidget *parent = 0);
    ~firstClass();

    void doSomething();

private:
    secondClass * myClass;
};

class secondClass : public QWidget
{
    Q_OBJECT

public:
    secondClass(QWidget *parent = 0);
    void doSomethingElse();
};
我想在运行
doSomethingElse()
时调用
doSomething()
方法。是否有任何方法可以使用
parent
指针执行此操作

我尝试了
parent->doSomething()
,但没有成功。Qt Creator似乎只建议在
parent->
之后使用QObject类中的方法

另一方面,我不能像
secondClass(firstClass*parent=0)那样编写它-编译器返回错误:


谢谢您的建议。

如果您确信
第二类
的父级总是
第一类
,那么您可以这样做:

static_cast<firstClass *>(parent)->doSomething();

实现这一点的更简单的方法是使用信号和插槽,而不是尝试直接调用不同的函数

class firstClass : public QWidget
{
    Q_OBJECT

public:
     firstClass(QWidget *parent = 0);
    ~firstClass();

public slot:
    void doSomething();

private:
    secondClass * myClass;
};

class secondClass : public QWidget
{
    Q_OBJECT

public:
    secondClass(QWidget *parent = 0);
    void doSomethingElse()
    {
        // ...
        emit ( triggerDoSomething() );
        // ...
    }

signal:
    void triggerDoSomething();
};

firstClass::firstClass(QWidget *parent) : 
    QWidget(parent), myClass(new secondClass(this))
{
    // ...
    bool connected = connect(myClass, SIGNAL(triggerDoSomething()),
        SLOT(doSomething()));
    assert( connected );
}

为了编译此代码,必须将符号“parent”替换为对parentWidget()或parent()的调用。这是因为“parent”仅在构造函数的范围内有效,而问题是如何从secondClass::doSomethingElse()调用doSomething()。只要在定义secondClass之前包含firstClass的定义,您的替代构造函数定义应编译:
secondClass::secondClass(firstClass*parent=0):QWidget(parent){}
您遇到了什么编译器错误?我不明白为什么编译器不允许您将第一个类指针传递给第二个类的构造函数。这两个类都在不同的文件中定义,我从第二个类中得到了错误。h-第一个类尚未声明(与#include“firstClass.h”和未声明它的情况相同)对我来说,这表明了另一个问题——包括警卫,也许是一样的?此外,它还可能在头文件中进行转发声明。
class firstClass : public QWidget
{
    Q_OBJECT

public:
     firstClass(QWidget *parent = 0);
    ~firstClass();

public slot:
    void doSomething();

private:
    secondClass * myClass;
};

class secondClass : public QWidget
{
    Q_OBJECT

public:
    secondClass(QWidget *parent = 0);
    void doSomethingElse()
    {
        // ...
        emit ( triggerDoSomething() );
        // ...
    }

signal:
    void triggerDoSomething();
};

firstClass::firstClass(QWidget *parent) : 
    QWidget(parent), myClass(new secondClass(this))
{
    // ...
    bool connected = connect(myClass, SIGNAL(triggerDoSomething()),
        SLOT(doSomething()));
    assert( connected );
}