到处都只是“在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,我觉得很奇怪。
答案 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)
也许没有帮助前作者,但其他人面临着这个问题。 我通过将调试库误认为是第一个版本来解决此错误。因此,如果您确定实现正确(首次实例化应用程序然后使用小部件),请检查链接器设置。