Использование родительского указателя Qt4 - PullRequest
2 голосов
/ 18 февраля 2010

У меня возникли проблемы с пониманием использования указателя parent в QT4.

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

Я хочу вызвать метод doSomething() во время работы doSomethingElse(). Есть ли способ сделать это с помощью указателя parent?

Я пытался parent->doSomething(), но это не работает. Похоже, что Qt Creator предлагает только методы из класса QObject после parent->.

С другой стороны, я не могу написать это как secondClass(firstClass *parent = 0); - компилятор возвращает ошибку:

Спасибо за любые предложения.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2010

Если вы уверены, что родительский элемент secondClass всегда будет firstClass, тогда вы можете сделать это:

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

В качестве альтернативы вы можете использовать qobject_cast и убедиться, чтоparent на самом деле является экземпляром firstClass:

firstClass *myParent = qobject_cast<firstClass *>(parent);
if(myParent){
    myParent->doSomething();
}
1 голос
/ 19 февраля 2010

Более удобный способ сделать это на Qt - это использовать сигналы и слоты, вместо того, чтобы пытаться напрямую вызывать другую функцию.

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