Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 必须在QWidget之前构造QApplication_C++_Qt_Widget_Qwidget - Fatal编程技术网

C++ 必须在QWidget之前构造QApplication

C++ 必须在QWidget之前构造QApplication,c++,qt,widget,qwidget,C++,Qt,Widget,Qwidget,到处都是“在QPaintDevice之前”的问题,没有任何地方是我的错误。那么,我们开始吧 我需要一个ExternQWidget,以便能够从外部访问它(因为我不知道其他方法)。基本上,我需要这样做:从1个窗口创建2个QWidget,转到第一个窗口,然后从那里隐藏主窗口并显示由主窗口创建的第二个窗口(虽然主窗口不是main(),但它也是QWidget) 我补充说 extern QWidget *widget = new QWidget 在任何地方,任何可能的方式,我仍然得到这个信息。我想,这意味

到处都是“在QPaintDevice之前”的问题,没有任何地方是我的错误。那么,我们开始吧

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

我补充说

extern QWidget *widget = new QWidget
在任何地方,任何可能的方式,我仍然得到这个信息。我想,这意味着我需要创建我的QApplication(在main.cpp中),然后才声明任何QWidgets。但是,我如何从另一个QWidget访问这些QWidget呢

代码如下:

另外,最终的目标是能够在battle.cpp中显示和隐藏gamewindow.cpp和world.cpp(只是普通类)

顺便说一句,添加Q#u对象和#include都不起作用


无论如何,如果我不能在一个窗口和另一个窗口之间使用函数,那有什么意义呢?我可以有一扇窗户在另一扇,然后在那扇,然后在那扇。。。但是从最后一个到上一个我什么都做不了。在使用Delphi多年后,我觉得这很奇怪。

在主应用程序中创建QApplication之前,不要使用外部变量或其他静态变量来创建小部件。在执行QWidget的构造函数之前,QApplication必须存在

与其通过extern共享变量,不如使主窗口的其他窗口成员相互了解,然后通过传递指针使这些窗口相互了解,或者使它们在主窗口中保持私有并从子窗口请求操作,例如通过信号/插槽。作为一般规则,不要使用全局变量,而是使用类成员

在下面的第一个窗口(应该是隐藏主窗口和第二个窗口)中,通过指针获取主窗口和第二个窗口,然后直接调用show/hide

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

    MainWindow mainWindow;
    mainWindow.show();

    return app.exec();
}
在主窗口中,为其他两个窗口指定两个成员,例如FirstWindow和SecondWindow: 类主窗口:公共QMainWindow{ ... 私人: FirstWindow*m_FirstWindow; 第二窗口*m_第二窗口; };

第一个窗口,内联以简洁:

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

也许不能帮助前作者,但其他人面临着这个问题。
我只是把一个调试库和一个发布库错当成了这个错误。因此,如果您确信实现正确(先实例化应用程序,然后使用小部件),请检查链接器设置。

我从未在C++/Qt程序中遇到过有效的“extern”用例。正确的方法是让主窗口进行管理,让子窗口通过信号/插槽连接发送对其他小部件的隐藏/显示请求,或者将指向要管理的小部件的指针传递给想要隐藏它们的小部件。(即,将指针存储为管理小部件中的成员)孩子们不能使用他们父母的函数(如隐藏或显示),我已经尝试过了。所以,唯一的方法就是信号/插槽连接,对吗?当我探索QT世界时,它们看起来很奇怪,我也无法让它们工作。无论如何,thx的方向,我会谷歌一些更多的信息连接。你也可以传递家长作为指针指向孩子,并调用例如显示/隐藏从那里。虽然它通常是不好的样式,并且会导致循环依赖让子窗口/小部件知道主窗口。哦,对了。我得试试这个。Thx同样可以作为gr8的快速修复选项。但是从长远的角度来看,我想写一个有效的好风格C++。UPD:我可以将指针存储在全局变量中,以便能够从任何类进行连接。我遇到了相同的错误。在应用程序实际运行之前,我不能使用QWidget类型的任何变量、指针等。您是如何做到的?自动回答:检查您是否正在编译发布版本,而不是调试版本。
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;  
};