【问题标题】:New window doesn't show新窗口不显示
【发布时间】:2013-08-04 06:40:57
【问题描述】:

我有一个按钮,当单击它时会显示一个带有 QLineEdit 和 QLabel 的新窗口,按钮和函数之间的连接工作正常,但新窗口不显示。

void windowManager::addQuestionDialog(){
    QWidget window(&parent);
    QLineEdit question;
    QLabel label;
    QVBoxLayout layout;

    layout.addWidget(&question);
    layout.addWidget(&label);
    window.setLayout(&layout);
    window.resize(200,200);
    window.setWindowTitle(QObject::trUtf8("Kérdés bevitele..."));
    window.show();

}

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    您需要为新窗口和要放入其中的内容创建类标签变量,而不是在函数中使用 new 关键字创建对象本身,因为如果您只是在函数中创建所有这些,而不是它们将在堆栈中创建,并且您应该知道,在函数返回/完成后,该函数的堆栈将被删除(以及您的新窗口和上面的东西)。

    在 windowManager 头文件中包含您要使用的类的头文件:

    #include <QDialog>
    #include <QLineEdit>
    #include <QLabel>
    #include <QVBoxLayout>
    

    然后在私有部分添加标签变量:

    private:
        QDialog *window;
        QLineEdit *question;
        QLabel *label;
        QVBoxLayout *layout;
    

    在按钮的点击事件中设置标签变量,并创建 UI 设置:

    void windowManager::addQuestionDialog()
    {
        window = new QDialog();
        question = new QLineEdit();
        label = new QLabel();
        layout = new QVBoxLayout();
        layout->addWidget(question);
        layout->addWidget(label);
        window->setLayout(layout);
        window->resize(200,200);
        window->setWindowTitle(QObject::trUtf8("Kérdés bevitele..."));
        window->show();
    }
    

    另外不要忘记在这里调用函数时应该使用-&gt; 而不是.,因为这些标记变量是指针。这也是为什么您不需要使用&amp; 运算符来获取他们的地址的原因。

    还请记住,您应该删除这些对象,因为 C++ 不会自动为您删除这些对象。你应该delete 一切你new。这样做的好地方是在 windowManager 类的析构函数中。在尝试删除之前检查标签变量是否不是NULL(如果有对象),否则可能会出错。

    更好的解决方案是传递一个父指针作为构造函数的参数,这样Qt会在它们关闭时删除它们,因为如果父被销毁,子也会被销毁。
    另外,您不必手动设置对象的去向,因为 Qt 现在会从层次结构中(在某些情况下)。

    在这种情况下,您的按钮的点击事件函数如下所示:

    void windowManager::addQuestionDialog()
    {
        window = new QDialog(this);
        question = new QLineEdit(window);
        label = new QLabel(window);
        layout = new QVBoxLayout(window);
        //The following two lines are optional, but if you don't add them, the dialog will look different.
        layout->addWidget(question);
        layout->addWidget(label);
        window->resize(200,200);
        window->setWindowTitle(QObject::trUtf8("Kérdés bevitele..."));
        window->show();
    }
    

    【讨论】:

      【解决方案2】:

      您在堆栈上创建窗口 QWidget 对象。因此,当函数 addQuestionDialog 调用完成时,该对象将被删除。更改代码以使用“new”创建新窗口小部件,并在关闭后将其删除。这里介绍了一些可能的解决方案:

      destructors in Qt4

      【讨论】:

      • 我改变了行:QWidget* window = new QWidget(&parent);和 window->setAttribute(Qt::WA_DeleteOnClose );但它仍然没有显示。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 2011-11-10
      • 2011-09-15
      • 2022-01-27
      相关资源
      最近更新 更多