• 10915阅读
  • 8回复

请问:Dialog类和Ui_Dialog类究竟是什么关系? 谢谢! [复制链接]

上一主题 下一主题
离线hover_sky
 

只看楼主 倒序阅读 楼主  发表于: 2009-05-14
请问:Dialog类和Ui_Dialog类究竟是什么关系? 谢谢!
dialog.h
  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3. #include <QtGui/QDialog>
  4. namespace Ui
  5. {
  6. class Dialog;
  7. }
  8. class Dialog : public QDialog
  9. {
  10. Q_OBJECT
  11. public:
  12. Dialog(QWidget *parent = 0);
  13. ~Dialog();
  14. private:
  15. Ui::Dialog *ui;
  16. };
  17. #endif // DIALOG_H

dialog.cpp
  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. Dialog::Dialog(QWidget *parent)
  4. : QDialog(parent), ui(new Ui::Dialog)
  5. {
  6. ui->setupUi(this);
  7. //QObject::connect(ui->pushButton, SIGNAL(clicked()),this, SLOT(quit()));
  8. }
  9. Dialog::~Dialog()
  10. {
  11. delete ui;
  12. }

ui_dialog.h
  1. /********************************************************************************
  2. ** Form generated from reading ui file 'dialog.ui'
  3. **
  4. ** Created: Thu May 14 22:52:58 2009
  5. ** by: Qt User Interface Compiler version 4.5.0
  6. **
  7. ** WARNING! All changes made in this file will be lost when recompiling ui file!
  8. ********************************************************************************/
  9. #ifndef UI_DIALOG_H
  10. #define UI_DIALOG_H
  11. #include <QtCore/QVariant>
  12. #include <QtGui/QAction>
  13. #include <QtGui/QApplication>
  14. #include <QtGui/QButtonGroup>
  15. #include <QtGui/QDialog>
  16. #include <QtGui/QHeaderView>
  17. #include <QtGui/QListView>
  18. #include <QtGui/QPushButton>
  19. QT_BEGIN_NAMESPACE
  20. class Ui_Dialog
  21. {
  22. public:
  23. QListView *listView;
  24. QPushButton *pushButton;
  25. void setupUi(QDialog *Dialog)
  26. {
  27. if (Dialog->objectName().isEmpty())
  28. Dialog->setObjectName(QString::fromUtf8("Dialog"));
  29. Dialog->resize(600, 400);
  30. listView = new QListView(Dialog);
  31. listView->setObjectName(QString::fromUtf8("listView"));
  32. listView->setGeometry(QRect(30, 10, 256, 192));
  33. pushButton = new QPushButton(Dialog);
  34. pushButton->setObjectName(QString::fromUtf8("pushButton"));
  35. pushButton->setGeometry(QRect(140, 280, 75, 23));
  36. retranslateUi(Dialog);
  37. QMetaObject::connectSlotsByName(Dialog);
  38. } // setupUi
  39. void retranslateUi(QDialog *Dialog)
  40. {
  41. Dialog->setWindowTitle(QApplication::translate("Dialog", "Dialog", 0, QApplication::UnicodeUTF8));
  42. pushButton->setText(QApplication::translate("Dialog", "bye", 0, QApplication::UnicodeUTF8));
  43. Q_UNUSED(Dialog);
  44. } // retranslateUi
  45. };
  46. namespace Ui {
  47. class Dialog: public Ui_Dialog {};
  48. } // namespace Ui
  49. QT_END_NAMESPACE
  50. #endif // UI_DIALOG_H


离线leehomexu
只看该作者 1楼 发表于: 2009-05-15
Ui::Dialog是从Ui_Dialog派生的类,使用Ui命名空间!
离线平常道
只看该作者 2楼 发表于: 2009-05-15
看你贴的代码的倒数第5行:
namespace Ui {
class Dialog: public Ui_Dialog {};
} // namespace Ui

明白楼上说的了吧
离线hover_sky

只看该作者 3楼 发表于: 2009-05-16
引用第1楼leehomexu于2009-05-15 13:01发表的  :
Ui::Dialog是从Ui_Dialog派生的类,使用Ui命名空间!


如果是这样的话,那
  1. private:
  2. Ui::Dialog *ui;


有什么作用呢?有必要弄一个自己本身类型的成员吗?这样搞,有什么好处呢?谢谢
离线hover_sky

只看该作者 4楼 发表于: 2009-05-16
引用第2楼平常道于2009-05-15 14:31发表的  :
看你贴的代码的倒数第5行:
namespace Ui {
class Dialog: public Ui_Dialog {};
} // namespace Ui
.......



感觉不是这样解读的?
离线hover_sky

只看该作者 5楼 发表于: 2009-05-16
Ui:Dialog继承自Ui_Dialog ,Dialog派生自QDialog并内含一个Ui,这个Ui指针是Ui:Dialog,目的是辅助Dialog创建UI内容。
离线平常道
只看该作者 6楼 发表于: 2009-05-18
你应该用的是Qt Creator自动创建的GUI工程。
在《C++GUI Qt4》中,作者使用了继承的方式来使用designer创建的窗体,也就是同时继承QDialog和UI_Dialog。
而在Qt Creator自动创建的项目中,使用了组合的方式来使用Designer创建的窗体,就是集成QDialog,而将UI_Dialog作为一个成员变量来使用,也就是
private:
Ui::Dialog *ui;
在前一种方式中,你可以在继承类中直接使用UI_Dialog上的组件。在后一种方式中,你要使用ui->XXX的方式使用UI_Dialog上的组件。
两种方式都可以,但个人感觉第二种好一些,毕竟组合比集成的耦合度来的弱一些,就是稍有点麻烦,要加ui->,但同时也带来了更清晰的代码结构
离线hover_sky

只看该作者 7楼 发表于: 2009-05-18
引用第6楼平常道于2009-05-18 09:53发表的  :
你应该用的是Qt Creator自动创建的GUI工程。
在《C++GUI Qt4》中,作者使用了继承的方式来使用designer创建的窗体,也就是同时继承QDialog和UI_Dialog。
而在Qt Creator自动创建的项目中,使用了组合的方式来使用Designer创建的窗体,就是集成QDialog,而将UI_Dialog作为一个成员变量来使用,也就是
private:
Ui::Dialog *ui;
.......


对,说的不错
离线dec31
只看该作者 8楼 发表于: 2009-07-19
请教为什么我按此方法后,系统提示“Ui::Dialog 没有合适的构造函数“,请指点一二,急!!
先行谢过了
快速回复
限100 字节
 
上一个 下一个