1.代码创建
创建一个MainWindow的qt程序,拖一个pushButton到MainWindow上,其click slot如下
void MainWindow::on_pushButton_clicked()
{
QDialog *dd=new QDialog;
dd->show();
}
在点击此pushButton会弹出一个Dialog 对话框,其各个属性都默认。
当然在dd->show()之前可以在dialog上添加一个label。即如下
void MainWindow::on_pushButton_clicked()
{
QDialog *dd=new QDialog;
QLabel *label=new QLabel(dd);//父窗口是dd,需要#include<QLabel>
label->setText("i'm label");
dd->show();
}
2.使用ui,添加Qt Designer From
上面1.是手动写代码创建一个dialog,如果想向dialog里面添加控件的话,都需要手动写代码,不方便。
添加一个Qt Designer From,模板选择Dialog with Buttons Right,即可创建一个form即dialog.ui
此时编译一下,在工程目录内会出现一个ui_dialog.h,
再拖一个pushButton到MainWindow上,其click slot如下
void MainWindow::on_pushButton_2_clicked()
{
QDialog *dd=new QDialog();
Ui_Dialog *ui=new Ui_Dialog;//构造Ui_Dialog对象,需要#include"ui_dialog.h"
ui->setupUi(dd);//为dd指定ui对象
dd->show();
}
说明几点:
ui_dialog.h源码类似如下,
/********************************************************************************
** Form generated from reading UI file 'dialog.ui'
**
** Created: Wed Nov 16 14:45:05 2011
** by: Qt User Interface Compiler version 4.6.3
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_DIALOG_H
#define UI_DIALOG_H
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QDialog>
#include <QtGui/QDialogButtonBox>
#include <QtGui/QHeaderView>
#include <QtGui/QPushButton>
QT_BEGIN_NAMESPACE
class Ui_Dialog
{
public:
QDialogButtonBox *buttonBox;
QPushButton *pushButton;
void setupUi(QDialog *Dialog)
{
if (Dialog->objectName().isEmpty())
Dialog->setObjectName(QString::fromUtf8("Dialog"));
Dialog->resize(400, 300);
buttonBox = new QDialogButtonBox(Dialog);
buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
buttonBox->setGeometry(QRect(290, 20, 81, 241));
buttonBox->setOrientation(Qt::Vertical);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
pushButton = new QPushButton(Dialog);
pushButton->setObjectName(QString::fromUtf8("pushButton"));
pushButton->setGeometry(QRect(230, 160, 98, 27));
retranslateUi(Dialog);
QObject::connect(buttonBox, SIGNAL(accepted()), Dialog, SLOT(accept()));
QObject::connect(buttonBox, SIGNAL(rejected()), Dialog, SLOT(reject()));
QMetaObject::connectSlotsByName(Dialog);
} // setupUi
void retranslateUi(QDialog *Dialog)
{
Dialog->setWindowTitle(QApplication::translate("Dialog", "Dialog", 0, QApplication::UnicodeUTF8));
pushButton->setText(QApplication::translate("Dialog", "PushButton", 0, QApplication::UnicodeUTF8));
} // retranslateUi
};
namespace Ui {
class Dialog: public Ui_Dialog {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_DIALOG_H
可以看出里面声明了一个Ui_Dialog类。此类的成员函数setupUi(QDialog *Dialog)就是用来对Dialog的画面设定的。向前面创建的dialog.ui里面拖拉控件等操作时,qt框架会在ui_dialog.h自动创建控件对应的对象并初始化。比如拖入一个pushButton 则ui_dialog.h中:
public成员中多出一个PushButton *pushButton;也可看出此成员是属于Ui_Dialog类的(而不是属于dialog)。所以在访问控件的时候需要用比如ui->pushButton;
(这点和vc不同,vc中,和拖到dialog的控件关联的对象都是dialog的成员,并且并没有Ui_Dialog之类的类)
setupUi函数中多出几行构造控件对象并初始化的代码
pushButton = new QPushButton(Dialog);
pushButton->setObjectName(QString::fromUtf8("pushButton"));
pushButton->setGeometry(QRect(230, 160, 98, 27));
总之,系统dialog内的控件的创建等代码都放到了setupUi里面,程序员只需Ui_Dialog *ui=new Ui_Dialog();ui->setupUi(dd)即可。而不必象1.中那样手动写代码创建了。
3.使用ui,添加Qt Designer From Class
上面
2.
添加Qt Designer From仅添加了一个Ui_Dialog类(对应窗体dialog.ui),如果要使用这个dialog.ui则要先构造一个dialog dd,再构造一个ui,再关联ui->setupUi(dd)。
也可以添加Qt Designer From Class,这样就把Ui_Dialog类和Dialog类一起创建了,并在Dialog类的构造函数中自动new ui并执行setupUi关联。如下
#include "dialog.h"
#include "ui_dialog1.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
这样只要创建Dialog对象,则Dialog 自动会关联的对应的ui
void MainWindow::on_pushButton_3_clicked()
{
Dialog *dd=new Dialog;//使用Qt Designer From Class新添加的类,需要#include"dialog.h"
dd->show();
}
对比一下,在vc6.0中添加一个dialog
1.动态创建,code from msdn------和qt中的1.对应
CMyDialog* pDialog;
void CMyWnd::OnSomeAction()
{
//pDialog initialized to NULL in the constructor of CMyWnd class
pDialog = new CMyDialog();
//Check if new succeeded and we got a valid pointer to a dialog object
if(pDialog != NULL)
{
BOOL ret = pDialog->Create(IDD_MYDIALOG,this);
if(!ret) //Create failed.
AfxMessageBox("Error creating Dialog");
pDialog->ShowWindow(SW_SHOW);
}
else
AfxMessageBox("Error Creating Dialog Object");
}
可见步骤是创建对象new CMyDialog然后创建资源pDialog->Create。
在qt中就不用Create资源了,应该是系统在创建对象的时候自动创建一个默认的资源并与之关联。
http://download.csdn.net/download/gouyue/2151399
2.使用资源----和qt中的3.对应
a.在resource页insert 一个对话框
b.ctrl+w,此时会弹出
如果之前没有创建选择第1个(如果之前已经创建了要关联的类,选择第2个),点击ok继续,创建一个新类
然后在需要的地方,比如
void CTtsetDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CMyDialog mydlg;//需要#include "MyDialog.h"
mydlg.DoModal();
}