跪求各位高手指导如何留住窗口
代码如下,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函数。
------解决方案--------------------
------解决方案--------------------
我觉得问题的根源是:堆和栈的问题!
楼主想用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();}