Qt+Creator快速入门-----第三章(窗口部件)学习总结
QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,而他们全部继承自QWidget(被称为基础窗口部件)。
3.1基础窗口部件QWidget
QObject类是所有支持Qt对象模型的对象的基类,QPaintDevice类是所有可以绘制的对象的基类。
QDialog *dialog=new QDialog(this);//定义了一个指向QDialog类对象的指针变量 dialog->show();
使用new操作符为控件分配空间,没有使用delete进行释放,是因为在Qt中销毁父对象时会自动销毁子对象。
int main(int argc, char *argv[]) { QApplication a(argc, argv); MyWidget w; w.show(); return a.exec(); }
只有程序进入主事件循环后才能接收事件,而show函数会触发显示事件,只有在完成a.exec函数调用进入消息循环后界面才能正常显示。
3.2对话框QDialog
QDialog类时所有对话框窗口类的基类,分为模态(modal)和非模态(modeless)。
模态对话框就是在没有关闭它之前,不能再同一个应用程序的其他窗口进行交互。
方法一:
QDialog dialog0(this);//定义一个对象 dialog0.exec();//模态对话框的实现方式
方法二:
QDialog *dialog=new QDialog(this);
dialog->setModal(true);
dialog->show();
方法一和二的区别是:方法二主窗口也会显示出来,这是因为调用完show()函数后会立即将控制权交给
调用者,程序会继续执行下去,二调用exec函数只有当对话框被关闭时才返回。
认识信号和槽
QT中使用信号和槽机制来完成对象之间的协同操作,信号和槽都是函数,比如单击窗口上的一个按钮后想要弹出一个对话框,那么可以将这个按钮的单击信号和自定义的槽关联起来,再这个槽中创建一个对话框并显示它。
关联信号和槽的方法有两种,一种是直接再设计器中进行(手写函数),第二种是自动关联。
以下是一个第一种信号和槽的实现方式
//添加声明 public slots: void ShowChildDialog(); //关联信号和槽,connect函数中的4个参数分别是发射信号的对象,发射的信号,接收信号的对象和要执行的槽 connect(ui->pushButton_9,&QPushButton::clicked,this,&MyWidget::ShowChildDialog); //槽函数的实现 void MyWidget::on_pushButton_9_clicked(bool checked) { ui->pushButton_9->setText(tr("&A")); qDebug()<<tr("按钮是否被按下")<<checked; }
文件对话框
文件对话框QFileDialog类提供了一个允许用户选择文件或文件夹的对话框
QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("文件对话框"), "D:", tr("图片文件(*png *jpg)")); qDebug()<< "fileNames:" << fileNames;
getOpenFileNames4个参数的作用分别是:指定父窗口、设置对话框标题,指定默认的打开目录,设置文件类型过滤器。
如果不指定文件过滤器,则默认选择所有类型的文件,利用”;;“可以设置不同类型的过滤器。
// QString fileName = QFileDialog::getOpenFileName(this, tr("文件对话框"), // "D:", tr("图片文件(*png *jpg);;文本文件(*txt)"));
输入对话框
输入对话框QInputDialog类用来提供一个对话框,可以让用户输入一个单一的数值或字符串。
bool ok; // 获取字符串 QString string = QInputDialog::getText(this, tr("输入字符串对话框"), tr("请输入用户名:"), QLineEdit::Normal,tr("admin"), &ok); if(ok) qDebug() << "string:" << string; // 获取整数 int value1 = QInputDialog::getInt(this, tr("输入整数对话框"), tr("请输入-1000到1000之间的数值"), 100, -1000, 1000, 10, &ok); //参数100表示默认的数值是100,-1000表示可输入的最小值是-1000,1000表示可输入的最大值是1000,10 //表示使用箭头每次变化10 if(ok) qDebug() << "value1:" << value1; // 获取浮点数 double value2 = QInputDialog::getDouble(this, tr("输入浮点数对话框"), tr("请输入-1000到1000之间的数值"), 0.00, -1000, 1000, 2, &ok); if(ok) qDebug() << "value2:" << value2; QStringList items; items << tr("条目1") << tr("条目2"); // 获取条目 QString item = QInputDialog::getItem(this, tr("输入条目对话框"), tr("请选择或输入一个条目"), items, 0, true, &ok); if(ok) qDebug() << "item:" << item;
消息对话框
// 问题对话框 int ret1 = QMessageBox::question(this, tr("问题对话框"), tr("你了解Qt吗?"), QMessageBox::Yes, QMessageBox::No); if(ret1 == QMessageBox::Yes) qDebug() << tr("问题!"); // 提示对话框 int ret2 = QMessageBox::information(this, tr("提示对话框"), tr("这是Qt书籍!"), QMessageBox::Ok); if(ret2 == QMessageBox::Ok) qDebug() << tr("提示!"); // 警告对话框 int ret3 = QMessageBox::warning(this, tr("警告对话框"), tr("不能提前结束!"), QMessageBox::Abort); if(ret3 == QMessageBox::Abort) qDebug() << tr("警告!"); // 错误对话框 int ret4 = QMessageBox::critical(this, tr("严重错误对话框"), tr("发现一个严重错误!现在要关闭所有文件!"), QMessageBox::YesAll); if(ret4 == QMessageBox::YesAll) qDebug() << tr("错误"); // 关于对话框 QMessageBox::about(this, tr("关于对话框"), tr("yafeilinux致力于Qt及Qt Creator的普及工作!"));
进度对话框
// 进度对话框 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; // 按下取消按钮则中断 } dialog.setValue(50000); // 这样才能显示100%,因为for循环中少加了一个数 qDebug() << tr("复制结束!"); }
向导对话框,用于安装软件时的向导和创建项目时的向导
QWizard类提供了一个设计向导界面的框架,包含的Trivial Wizard、License Wizard 和Class Wizard的3个实例程序可以参考。