当前位置: 代码迷 >> QT开发 >> 求教啊为什么窗口一闪而逝?Qt新手,照着书下打的
  详细解决方案

求教啊为什么窗口一闪而逝?Qt新手,照着书下打的

热度:35   发布时间:2016-04-25 04:38:25.0
求教啊,为什么窗口一闪而逝?Qt新手,照着书上打的
跪求各位高手指导如何留住窗口

代码如下,h文件和main十分简单,就不上来了,主要是类的定义,继承于QDialog的类
C/C++ code
#include <QtGui>#include "extension.h"Extension::Extension(QWidget *parent)    : QDialog(parent){    setWindowTitle(tr("Extension Window try"));    createBaseInfo();    createDetailInfo();    QVBoxLayout * layout = new QVBoxLayout;    layout->addWidget(baseWidget);    layout->addWidget(detailWidget);    layout->setSizeConstraint(QLayout::SetFixedSize);    layout->setSpacing(10);    setLayout(layout);}void Extension::createBaseInfo(){    baseWidget = new QWidget;    QLabel * nameLabel = new QLabel(tr("Name:"));    QLineEdit * nameEdit = new QLineEdit;    QLabel * sexLabel = new QLabel(tr("Sex:"));    QComboBox * sexCombo = new QComboBox;    sexCombo->addItem(tr("Male"));    sexCombo->addItem(tr("Female"));    QPushButton * okBtn = new QPushButton(tr("OK"));    QPushButton * detailBtn = new QPushButton(tr("detail"));    connect(detailBtn,SIGNAL(clicked()),this,SLOT(slotExtension()));    QDialogButtonBox * btnBox = new QDialogButtonBox(Qt::Vertical);    btnBox->addButton(okBtn,QDialogButtonBox::ActionRole);    btnBox->addButton(detailBtn,QDialogButtonBox::ActionRole);    baseWidget->show();}void Extension::createDetailInfo(){    detailWidget = new QWidget;    QLabel * ageLabel = new QLabel(tr("Age:"));    QLineEdit * ageEdt = new QLineEdit;    ageEdt->setText(tr("20"));    QLabel * departmentLabel = new QLabel(tr("Department:"));    QComboBox * departmentCombo = new QComboBox;    departmentCombo->addItem(tr("test 1"));    departmentCombo->addItem(tr("test 2"));    departmentCombo->addItem(tr("test 3"));    departmentCombo->addItem(tr("test 3"));    QLabel * emailLabel = new QLabel(tr("e-mail"));    QLineEdit * emailEdit = new QLineEdit;    emailEdit->setText(tr("@"));    detailWidget->hide();}void Extension::slotExtension(){    if(detailWidget->isHidden())    {        detailWidget->show();    }    else    {        detailWidget->hide();    }}


------解决方案--------------------
1. 不妨多点解释,是哪个窗口一闪而过,该窗口对象在哪儿
2. 不妨贴出你认为很简单的 main
------解决方案--------------------
粗粗地看了一下,貌似没什么问题

LZ还是把 .h, main.cpp 帖出来吧
------解决方案--------------------
main函数就是用这个类实例化

关键问题可能就是 你如何实例化。
------解决方案--------------------
实现中看不出来问题
------解决方案--------------------
show函数为非阻塞函数,show运行后,退出函数,w就被析构了。
这儿应该用exec函数。
------解决方案--------------------
探讨

show函数为非阻塞函数,show运行后,退出函数,w就被析构了。
这儿应该用exec函数。

------解决方案--------------------
我觉得问题的根源是:堆和栈的问题!

楼主想用modeless 类型的对话框,所以才show()的。
但是,就像上面提到的,要非模态对话框出来作用域之后就会析构掉,因此要new一个对话框对象,然后show().
这样的话,这个对话框就不会被析构掉。
------解决方案--------------------
举个例子:
你的代码的作用域中:
C/C++ code
{  Dialog *dlg = new Dialog();  dlg->show();}
------解决方案--------------------
我将LZ的程序补充完整了,但我还是看不出哪里错了,等待高手

C/C++ code
#include <QtGui>class Extension : public QDialog{private:    QWidget *baseWidget;    QWidget *detailWidget;public:    Extension();    void createBaseInfo();    void createDetailInfo();    private slots:        void slotExtension();};Extension::Extension() : QDialog(){    setWindowTitle(tr("Extension Window try"));    createBaseInfo();    createDetailInfo();    QVBoxLayout * layout = new QVBoxLayout;    layout->addWidget(baseWidget);    layout->addWidget(detailWidget);    layout->setSizeConstraint(QLayout::SetFixedSize);    layout->setSpacing(10);    setLayout(layout);}void Extension::createBaseInfo(){    baseWidget = new QWidget;    QLabel * nameLabel = new QLabel(tr("Name:"));    QLineEdit * nameEdit = new QLineEdit;    QLabel * sexLabel = new QLabel(tr("Sex:"));    QComboBox * sexCombo = new QComboBox;    sexCombo->addItem(tr("Male"));    sexCombo->addItem(tr("Female"));    QPushButton * okBtn = new QPushButton(tr("OK"));    QPushButton * detailBtn = new QPushButton(tr("detail"));    connect(detailBtn,SIGNAL(clicked()),this,SLOT(slotExtension()));    QDialogButtonBox * btnBox = new QDialogButtonBox(Qt::Vertical);    btnBox->addButton(okBtn,QDialogButtonBox::ActionRole);    btnBox->addButton(detailBtn,QDialogButtonBox::ActionRole);    baseWidget->show();}void Extension::createDetailInfo(){    detailWidget = new QWidget;    QLabel * ageLabel = new QLabel(tr("Age:"));    QLineEdit * ageEdt = new QLineEdit;    ageEdt->setText(tr("20"));    QLabel * departmentLabel = new QLabel(tr("Department:"));    QComboBox * departmentCombo = new QComboBox;    departmentCombo->addItem(tr("test 1"));    departmentCombo->addItem(tr("test 2"));    departmentCombo->addItem(tr("test 3"));    departmentCombo->addItem(tr("test 3"));    QLabel * emailLabel = new QLabel(tr("e-mail"));    QLineEdit * emailEdit = new QLineEdit;    emailEdit->setText(tr("@"));    detailWidget->hide();}void Extension::slotExtension(){    if(detailWidget->isHidden())    {        detailWidget->show();    }    else    {        detailWidget->hide();    }}int main(int argc, char *argv[]){    QApplication app(argc, argv);     Extension w;     w.show();     return app.exec();}
  相关解决方案