Qt4父指针用法
我在理解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 {
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 );
}