指向QMainWindow更改的指针

时间:2012-05-15 17:15:52

标签: c++ qt multiple-inheritance

我正在使用Qt创建一个窗口,我有以下代码(这在某种程度上是伪代码):

class MyInterface {
    virtual void doupdate() = 0;
}

class InterfaceHandler {
    InterfaceHandler(MyInterface *i) {
      the_int = i;

      start_thread(&mainloop);
    }

    void mainloop() {
        while(1) the_int->doupdate();
    }

    MyInterface *the_int;
}

class console : public QMainWindow, public MyInterface {
    console() {
            InterfaceHandler x(this);
    }

    void doupdate() {
        //code to modify the gui
    }
} 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    console w(argc, argv);
    w.show();
    return a.exec();
}

我的问题是,在the_int->doupdate()中调用mainloop()时,对the_int的引用是错误的。我认为这与console继承QMainWindow的事实有关,但我不确定解决方案是什么。

MyInterface并非始终由QObject继承。我试图将doupdate()console拆分到另一个类中,该类在构造函数中传递给console的引用,但得到相同的结果。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

假设您的“伪代码”足够接近您的真实代码,则问题如下:

console() {
  InterfaceHandler x(this);
}

构造函数完成后,作为本地(自动)变量的x将被销毁。一旦构造函数返回,您创建的InterfaceHandler实例就不再存在。

您需要将x保留为该类的成员变量,或者从其他位置创建并存储它。 (但是保持它成为一个成员是有道理的,因为对象的生命周期是相关的。)你还需要非常小心该线程,它需要在console被销毁之前停止。