2016-07-11 34 views
1

我有一个Qt Widgets应用程序,在Qt-Creator中创建和编辑。为什么推荐的QDialog实例化是这样的?

主窗口(MainWindow类)有一个菜单栏,用一个按钮打开一个小对话框(带有文本或小部件的设置)。

要创建一个新的“窗口”,我打开Qt-Creator中的“创建新文件”对话框,并选择Qt设计器窗体类,它创建所需的页眉,源文件和ui文件(dialogabout.h,dialogabout.cpp ,dialogabout.ui)。

如果我与docs跟着一起,然后我打开了QDialog像这样:

QDialog * widget = new QDialog; 
Ui::DialogAbout about_ui; 
about_ui.setupUi(widget); 
widget->exec(); 

这工作,但如果我修改新的对话框的初始化程序的按钮连接到关闭信号,连接语句(以及其中的任何其他代码)永远不会到达。

DialogAbout::DialogAbout(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::DialogAbout) 
{ 
    ui->setupUi(this); 

    qDebug() << "I'm alive!"; // No output happens 
    connect(ui->pushButton_close, SIGNAL(clicked(bool)), this, SIGNAL(please_close())); // No signal created on pushbutton click. 
} 

我怀疑这是因为我没有明确地做过widget = new DialogAbout(this)。如果我用不同的方式实例化新对话框:

DialogAbout * newwindow; 
newwindow = new DialogAbout(this); 
newwindow->exec(); 

然后connect语句和qDebug工作。

我的问题是:偏离文档推荐的创建对话框的方式有哪些缺陷?有没有办法使用之前的实例化方法来获得此功能?

+0

please_close()是一个信号还是一个SLOT? – rflobao

回答

1

请注意,DialogAbout与Ui :: DialogAbout不同。 Ui :: DialogAbout是放置在UI命名空间中的一类构建,由uic自动创建。在你的项目中,这个文件的名字应该是“ui_dialogabout h”。

class Ui_DialogAbout 
{ 
public: 
    QPushButton *pushButton_close; 

    void setupUi(QDialog *DialogAbout) 
    { 
     ... 
    } // setupUi 

    void retranslateUi(QDialog *DialogAbout) 
    { 
     ... 
    } // retranslateUi 

}; 
namespace Ui { 
    class DialogAbout: public Ui_DialogAbout {}; 
} // namespace Ui 

这里您使用了一个类QDialog,并使用Ui :: DialogAbout在其中构建布局。请注意,Ui :: DialogAbout具有在QDialog中创建组件的功能。

QDialog * widget = new QDialog; 
Ui::DialogAbout about_ui; 
about_ui.setupUi(widget); 
widget->exec(); 

如果你专注了QDialog的DialogAbout你的代码应该是这样的:

DialogAbout * widget = new DialogAbout(); 
Ui::DialogAbout about_ui; 
about_ui.setupUi(widget); 
widget->exec(); 

但作为setupUi()已经是中DialogAbout,你不能再打电话,结果:

DialogAbout * widget = new DialogAbout(); 
widget->exec(); 
+0

谢谢你为我清理。我现在看到如何用任何一种方法获得相同的功能。 – ctag

相关问题