新窗口不显示

时间:2013-08-03 21:12:05

标签: c++ qt

我有一个按钮,当点击一个带有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();

}

2 个答案:

答案 0 :(得分:2)

您需要为新窗口创建类标记变量以及要放入其中的内容,而不是使用函数中的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();
}

另外请不要忘记,您应该使用->代替.来调用函数,因为这些标记变量是指针。这就是为什么您不需要使用&运算符来获取其地址的原因。

另请注意,您应该删除这些对象,因为C ++不会自动为您删除这些对象。您应delete new所有内容windowManager。执行此操作的好地方是NULL类中的析构函数。在尝试删除它们之前,只需检查标记变量是否为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(); } (如果有对象),否则可能会发生错误。

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

在这种情况下,按钮的点击事件功能如下所示:

{{1}}

答案 1 :(得分:0)

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

destructors in Qt4