必须在QWidget之前构造QApplication

时间:2014-02-05 22:57:58

标签: c++ qt widget qwidget

到处都只是“在QPaintDevice之前”的问题而且我的错误无处可去。所以,我们走了。

我需要一个外部QWidget才能从外部访问它(因为我不知道其他任何方法)。基本上,我需要这个:从1个窗口创建2个QWidgets,转到第一个窗口,然后从那里隐藏主窗口并显示由主窗口创建的第二个窗口(虽然主窗口不是main(),它也是QWidget)。

我添加了

extern QWidget *widget = new QWidget

无处不在,无论如何,我仍然得到了这个信息。我想,这意味着我需要创建我的QApplication(在main.cpp中),然后才声明任何QWidgets。但是,我如何从另一个QWidgets访问那些QWidgets?

代码在这里: https://github.com/ewancoder/game/tree/QWidget_before_QApp_problem

P.S。最终目标是能够显示和隐藏来自battle.cpp的gamewindow.cpp和world.cpp(只是常规类)

顺便说一句,添加Q_OBJECT和#include都不起作用。

无论如何,如果我不能使用从一个窗口到另一个窗口的功能,那么重点是什么?我可以在另一个窗口中有一个窗口,然后在另一个窗口中有另一个窗口,然后在另一个窗口中有一个窗口......但是从最后一个到前一个我都做不了什么。经过多年的Delphi,我觉得很奇怪。

2 个答案:

答案 0 :(得分:1)

在main中创建QApplication之前,不要使用导致创建窗口小部件的外部或其他静态变量。在执行QWidget的构造函数之前,QApplication必须存在。

不是通过extern共享变量,而是使主窗口的其他窗口成员,然后通过传递指针使彼此知道窗口,或者在MainWindow中将它们保密,并从子窗口请求动作,例如:通过信号/插槽。作为通用规则,不要使用全局变量,而是使用类成员。

在下面的FirstWindow(假设是hide主窗口和secondWindow)中获取主窗口,第二个窗口通过指针传递,然后直接调用show / hide。

int main(int argc, char **argv) {
    QApplication app(argc, argv);

    MainWindow mainWindow;
    mainWindow.show();

    return app.exec();
}

在主窗口中,其他两个窗口有两个成员,比如FirstWindow和SecondWindow:     class MainWindow:public QMainWindow {         ...     私人的:         FirstWindow * m_firstWindow;         SecondWindow * m_secondWindow;     };

MainWindow::MainWindow(QWidget *parent) {
     m_firstWindow = new FirstWindow; //not pass this as parent as you want to hide the main window while the others are visible)
     m_secondWindow = new SecondWindow;
     m_firstWindow->setMainWindow(this);
     m_firstWindow->setSecond(m_secondWindow);
     m_firstWindow->show(); //Show first window immediately, leave second window hidden
}

MainWindow::~MainWindow() {
     //Manual deletion is necessary as no parent is passed. Alternatively, use QScopedPointer
     delete m_firstWindow;
     delete m_secondWindow;
}

FirstWindow,内联简洁:

class FirstWindow : public QWidget {
    Q_OBJECT
public:
    explicit FirstWindow(QWidget *parent = 0) : QWidget(parent) {}

    void setMainWindow(MainWindow *mainWindow) { m_mainWindow = mainWindow); }
    void setSecondWindow(SecondWindow *secondWindow) { m_secondWindow = secondWindow; }

private Q_SLOTS:
     void somethingHappened() { //e.g. some button was clicked
         m_mainWindow->hide();
         m_secondWindow->show();
     }
private: 
     MainWindow* m_mainWindow;
     SecondWindow* m_secondWindow;  
};

答案 1 :(得分:1)

也许没有帮助前作者,但其他人面临着这个问题。 我通过将调试库误认为是第一个版本来解决此错误。因此,如果您确定实现正确(首次实例化应用程序然后使用小部件),请检查链接器设置。