本书源码 www.yafeilinux.com
1 QDialog w; Qlable a (&w) 指定父类 用父类来构造。 resize(q,b) 指定窗口大小
2.setupUi 函数 用来生成 ui界面,retranslateUi() 用于对字符串进行编码转换
3. qt c++中 如果需要引用某一个ui 文件,那么需要添加对应的ui头文件 #include "ui_helloDialog.h". 但是如果采用前置声明则可以不加。如下, 用namespace 声明,并在其中加入声明ui类。 然后在 A.H 就不需要再加头文件了。当然在A.cpp 里面还是需要加头文件的。
#include <QDialog>
namespace Ui {
class HelloDialog;
}
class A : public QDialog
{
Q_OBJECT
public:
explicit HelloDialog(QWidget *parent = 0);
~HelloDialog();
private:
Ui::HelloDialog *ui;
}
4. qt 中 引入 Q_OBJECT 的作用,如上, 这是因为这个宏里面包含了 QT中要使用的信号槽
5. 显示构造函数 explicit HelloDialog(QWidget *parent = 0); 参数是用来指定父窗口,默认没有父窗口
6. 构造函数创建ui 1. 将创建代码放在构造函数首部
HelloDialog::HelloDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::HelloDialog)
{
ui->setupUi(this); // this 表示为这个类 所代表的对话框创建界面
}
或者
HelloDialog::HelloDialog(QWidget *parent) :
QDialog(parent),
{
ui=new Ui::HelloDialog();
ui->setupUi(this);
}
这里使用的是单继存,也可以同时继承 HelloDialog 和 QDialog 这样就不需要再指定ui 指针了。
core 核心模块 gui 界面模块
7 窗口 空间 父窗口
// 在代码中可以使用中文字符串
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
// 新建QWidget类对象,默认parent参数是0,所以它是个窗口
QWidget *widget = new QWidget();
// label2指定了父窗口为widget,所以不是窗口
QLabel *label2 = new QLabel(widget);
label->show();
widget->show();
int ret = a.exec();
delete label;
delete widget;
}
QT中 销毁父对象的时候会自动销毁子对象,所以这里 需要delete label1 但不需要delete label2
qt中把没有嵌入到其他窗口的部件称为窗口,窗口就是没有父部件的部件,所以又称为顶级部件,窗口一般都有边框和标题栏。所以label 可以作为一个窗口 也可以作为一个空间或者组件存在于其他窗口中,称为子部件。QT中大部分部件都是用作子部件。
Qwidget 继承QObject 类和QPaintDevice 类,其他大部分都是继承Qwidget
QWidget *widget = new QWidget(0,Qt::Dialog); 第一个参数指定父窗口类型,默认是没有,第二个参数指定窗口类型。
Dialog 对话框类型,SplashScreen 欢迎类型
QWidget *widget = new QWidget(0,Qt::Dialog|Qt::WindowStaysOnTopHint); 可以隐藏边框
8 模态和非模态 按照运行时是否还可以和其他窗口交互,分为模态和非模态。
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QDialog dialog(this);
dialog->show();
}
上面这个, dialog 界面一闪而过,因为随着构造函数结束,其中的局部变量也消亡了。
改进:
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QDialog *dialog = new QDialog(this); // 这里指定父窗口类 为MyWidget
dialog->show();
}
提问,这里需要使用delete dialog 吗?
答:这里 建立了QDialog的指针变量。 但是 由于指定了父窗口,所以不需要。随着父窗口的消亡会自动释放。
上段代码 指定了dialog 的父窗口为this ,也就是MyWidget ,当运行的时候 会出现两个窗口,一个是myWidget 一个是dialog对话框,此时 由于存在父子关系,当关闭父窗口myWidget时,子窗口dialog也会消失。
修改代码: QDialog *dialog = new QDialog(0); // 这里没有父窗口
此时运行程序也会出现两个窗口,但是当关闭myWidget 时,dialog 不会消失,因为他们是两个独立的窗口,均为父窗口也就是顶层窗口。
上面代码继续修改: 不用指针
QDialog dialog (this); dialog.exec(); 运行,此时 先弹出了dialog 对话框,但是mywidget 没有弹出来,等关闭了dialog后,才弹出了mywidget 窗口。 这就是模态对话框。 dialog.exec(); 这里是一个阻塞死循环
模态对话框,就是运行时不能与其他窗口交互,想要使用 就调用 exec()
建立模态对话框的两种方法 : 1. 调用exec Dialog dialog(this); dialog->exec()
2. 调用setModal(true) QDialog *dialog = new QDialog(this); dialog->setModal(true) dialog->show();
dialog->show();
方法一和二的区别 :
方法一: 先显示dialog 等关闭了dialog 后才显示mywidget
方法二:先显示dialog ,马上会显示mywidget 但是此时 无法操作mywidget ,一定要关闭dialog 后才可以操作mywidget
这是因为调用玩完dialog->show 后马上会把控制权交给调用者,那么程序可以继续往下执行。
setModal 默认是 Qt::ApplicationModal 阻塞所有应用程序
setWindowModality : Qt::ApplicationModal 阻塞所有应用程序 Qt::WindowModal 阻塞父窗口 祖先窗口和他们的子窗口 NonModal 不阻塞(非模态)
多窗口切换:信号槽
int main(int argc, char *argv[]){ QApplication a(argc, argv); MyWidget w; MyDialog dialog; //新建MyDialog类对象 if(dialog.exec() == QDialog::Accepted) { //判断dialog执行结果 w.show(); //如果是按下了“进入主界面”按钮,则显示主界面 return a.exec(); //程序正常运行 } else return 0; //否则,退出程序 } void MyDialog::on_pushButton_clicked() { accept(); }
进入主界面后 如果需要重新登录
// 重新登录按钮
void MyWidget::on_pushButton_clicked()
{
// 先关闭主界面,其实是隐藏起来了,并没有真正退出
close();
// 新建MyDialog对象
MyDialog dlg;
// 如果按下了“进入主窗口”按钮,则再次显示主界面
// 否则,因为现在已经没有显示的界面了,所以程序将退出
if(dlg.exec()== QDialog::Accepted) show();
}
请注意 :这里调用close(0 ,并不一定退出,只有当剩下最后一个主窗口的时候才会退出。当不是最后一个是,其实关闭只是暂时影藏起来了。
以上,自己采用QT设计师设计的对话框 都称为自定义对话框。
9. 标准对话框 :
1. 颜色对话框 2. 文件对话框 3. 字体对话框 4.输入对话框 消息对话框 错误对话框 进度对话框 向导对话框 打印对话框 打印预览对话框 页面设置对话框
颜色对话框的两种使用方式 : 1 调用静态函数 QColorDialog.getColor 2. 先创建对象 再设置 QColorDialog colordialog;
9.4 输入对话框 :QinputDialog 用来提供一个简单方便的对话框,从而从用户那里获取一个单一的数值或者字符串
QString string = QInputDialog::getText(this,tr("输入字符串对话框"), tr("请输入用户名:"),QLineEdit::Normal,tr("admin"),&ok); if(ok) qDebug() << "string:"<<string;
// 获取条目 QStringList items;items << tr("条目1") << tr("条目2"); QString item = QInputDialog::getItem(this,tr("输入条目对话框"), tr("请选择一个条目"),items,0,true,&ok); if(ok) qDebug() << "item:"<<item;
9.5 消息对话框 也就是 QMessageBox
int ret1 = QMessageBox::question(this,tr("问题对话框"),tr("你了解Qt吗?"),QMessageBox::Yes,QMessageBox::No); if(ret1 == QMessageBox::Yes) qDebug()<<tr("问题!");
9.6 进度对话框
// 进度对话框
void MyWidget::on_pushButton_6_clicked()
{ QProgressDialog dialog(tr("文件复制进度"),tr("取消"),0,50000,this); // 设置窗口标题 dialog.setWindowTitle(tr("进度对话框")); // 将对话框设置为模态 dialog.setWindowModality(Qt::WindowModal); dialog.show(); // 演示复制进度for(int i=0;i<50000;i++){// 设置进度条的当前值dialog.setValue(i); // 避免界面冻结 QCoreApplication::processEvents(); // 按下取消按钮则中断 if(dialog.wasCanceled()) break; }
9.7 错误信息对话康 QerrorMessage
9.8 向导对话框
// 向导页面1
QWizardPage * MyWidget::createPage1()
{ QWizardPage *page = new QWizardPage; page->setTitle(tr("介绍")); return page;}