【问题标题】:Qt4 parent pointer usageQt4父指针使用
【发布时间】:2010-02-18 19:48:16
【问题描述】:

我在理解 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); 那样写——编译器返回错误:

感谢您的任何建议。

【问题讨论】:

  • 只要 firstClass 的定义在定义 secondClass 之前被#included,您的替代构造函数定义应该编译:secondClass::secondClass(firstClass *parent = 0) : QWidget(parent) { } 你得到什么编译器错误?
  • 我不明白为什么编译器不允许你将 firstClass 指针传递给 secondClass 的构造函数。
  • 两个类都定义在不同的文件中,我从 secondClass.h 得到错误 - firstClass 没有被声明(与#include "firstClass.h" 相同,没有它)
  • 对我来说,这表明某处存在另一个问题——可能包含保护是相同的?此外,它可能会在头文件中前向声明。

标签: qt qt4 parent


【解决方案1】:

如果您确定secondClass 的父级始终是firstClass,那么您可以这样做:

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

您也可以使用qobject_cast 并检查以确保parent 实际上是firstClass 的一个实例:

firstClass *myParent = qobject_cast<firstClass *>(parent);
if(myParent){
    myParent->doSomething();
}

【讨论】:

  • 符号“parent”必须替换为调用 parentWidget() 或 parent() 才能编译此代码。这是因为 'parent' 仅在构造函数的范围内有效,而问题询问如何从 secondClass::doSomethingElse() 调用 doSomething()。
【解决方案2】:

更多的 Qt-ish 方法是使用信号和槽,而不是尝试直接调用不同的函数。

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 );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 2015-10-30
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多