目录
三 窗口部件
1.QWidget
1.1 窗口与子部件
-
main.cpp
#include <QtWidgets> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 新建QWidget类对象,默认parent参数是nullptr,所以它是个窗口 QWidget *widget = new QWidget(); // 设置窗口标题 widget->setWindowTitle(QObject::tr("我是widget")); // 新建QLabel对象,默认parent参数是nullptr,所以它是个窗口 QLabel *label = new QLabel(); label->setWindowTitle(QObject::tr("我是label")); // 设置要显示的信息 label->setText(QObject::tr("label:我是个窗口")); // 改变部件大小,以便能显示出完整的内容 label->resize(220, 20); // label2指定了父窗口为widget,所以不是窗口,只是widget窗口的子部件 QLabel *label2 = new QLabel(widget); label2->setText(QObject::tr("label2:我不是独立窗口,只是widget的子部件")); label2->resize(250, 20); // 在屏幕上显示出来 label->show(); widget->show(); int ret = a.exec(); delete label; delete widget; return ret; }
-
.pro
QT+=widgets SOURCES += \ main.cpp
2.QDialog
2.1 模态和非模态对话框
-
模块对话框:
-
非模块对话框:
2.2 初始信号和槽并实现多窗口切换
1) 定义信号和槽
-
步骤
1.在
widget.h
的MyWidget
类定义中添加槽的声明。public slots: //槽一般用关键词slots修饰 void showChildDialog();
2.在
widget.cpp
中定义槽函数的功能。void MyWidget::showChildDialog() { QDialog *dialog=new QDialog(this); dialog->show(); }
3.在
MyWidget
类构造函数中,加入connect()
函数将单击信号与槽关联。即受到指定信号后执行槽函数。
MyWidget::MyWidget(QWidget*parent): QWidget(parent), ui(new Ui::MyWidget) { ui->setupUi(this); connect(ui->showChildButton,&QPushButton::clicked, this,&MyWidget::showChildDialog); }
2) 自动定义对话框
#include "dialog.h" #include "./ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent) , ui(new Ui::Dialog) { ui->setupUi(this); } Dialog::~Dialog() { delete ui; } void Dialog::on_pushButton_clicked() { //accept是QDialog中的一个槽 //功能:1.执行这个槽后隐藏这个模式对话框;2.返回QDialog::Accepted值 accept(); } void Dialog::on_pushButton_2_clicked() { //reject与accept对应 //返回一个QDialog::Rejected值 reject(); }
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACE class Dialog : public QDialog { Q_OBJECT public: Dialog(QWidget *parent = nullptr); ~Dialog(); private slots: void on_pushButton_2_clicked(); void on_pushButton_clicked(); private: Ui::Dialog *ui; }; #endif // DIALOG_H
#include "dialog.h" #include"QWidget" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog dialog; //新建类对象 if(dialog.exec()==QDialog::Accepted) //判断dialog执行结果 { QWidget w; w.show(); //如果按下进入主界面按钮,则进入主界面 return a.exec(); //程序正常运行 } else { return 0; //退出程序 } }
3) 标准对话框
a.颜色对话框
//颜色对话框 void Widget::on_pushButton_clicked() { QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框")); qDebug()<<"color:"<<color; }
b.文件对话框
//文件对话框 void Widget::on_pushButton_2_clicked() { // //读取单个文件 // QString filename=QFileDialog::getOpenFileName(this,tr("文件对话框"), // "D:\photo",tr("图片文件(*.jpg *.png)")); // qDebug()<<"fileName:"<<filename; //读取多个文件 QStringList filenames=QFileDialog::getOpenFileNames(this,tr("多文件对话框"), "D:\photo",tr("图片文件(*.jpg *.png)")); qDebug()<<"filenames:"<<filenames; }
c.字体对话框
//字体对话框 void Widget::on_pushButton_3_clicked() { bool ok;//是否按下ok QFont font=QFontDialog::getFont(&ok,this); //如果按下ok,字体对话框按钮使用新字体 //如果按下cancel,则输出信息 if(ok) { ui->pushButton_3->setFont(font); } else { qDebug()<<tr("没有选择字体!"); } }
d.输入对话框
//输入对话框 void Widget::on_pushButton_4_clicked() { 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); if(ok) { qDebug()<<"valuel:"<<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()<<"items:"<<item; } }
e.消息对话框
//消息对话框 void Widget::on_pushButton_5_clicked() { //问题对话框 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("zyy")); }
f.进度对话框
//进度对话框 void Widget::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<999999999;i++) { dialog.setValue(i);//设置进度条的当前值 QCoreApplication::processEvents();//避免页面冻结 if(dialog.wasCanceled()) { break; } dialog.setValue(999999999); qDebug()<<tr("复制结束!"); } }
g.错误消息对话框
//错误消息对话框 void Widget::on_pushButton_7_clicked() { errordlg->setWindowTitle(tr("错误信息对话框")); errordlg->showMessage(tr("这里是出错信息!")); }
h.向导对话框
//3个向导页面 QWizardPage *Widget::createPage1() { QWizardPage *page=new QWizardPage; page->setTitle(tr("介绍")); return page; } QWizardPage *Widget::createPage2() { QWizardPage *page=new QWizardPage; page->setTitle(tr("用户信息选择")); return page; } QWizardPage *Widget::createPage3() { QWizardPage *page=new QWizardPage; page->setTitle(tr("结束")); return page; } //向导对话框 void Widget::on_pushButton_8_clicked() { QWizard wizard(this); wizard.setWindowTitle(tr("向导对话框")); wizard.addPage(createPage1());//添加向导页面 wizard.addPage(createPage2()); wizard.addPage(createPage3()); wizard.exec(); }
*完整代码
#include "widget.h" #include "ui_widget.h" #include "QDebug" #include "QColorDialog" #include "QFileDialog" #include "QFontDialog" #include "QLineEdit" #include "QInputDialog" #include "QMessageBox" #include "QProgressDialog" #include "QErrorMessage" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); errordlg=new QErrorMessage(this); } Widget::~Widget() { delete ui; } //颜色对话框 void Widget::on_pushButton_clicked() { QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框")); qDebug()<<"color:"<<color; } //文件对话框 void Widget::on_pushButton_2_clicked() { // //读取单个文件 // QString filename=QFileDialog::getOpenFileName(this,tr("文件对话框"), // "D:\photo",tr("图片文件(*.jpg *.png)")); // qDebug()<<"fileName:"<<filename; //读取多个文件 QStringList filenames=QFileDialog::getOpenFileNames(this,tr("多文件对话框"), "D:\photo",tr("图片文件(*.jpg *.png)")); qDebug()<<"filenames:"<<filenames; } //字体对话框 void Widget::on_pushButton_3_clicked() { bool ok;//是否按下ok QFont font=QFontDialog::getFont(&ok,this); //如果按下ok,字体对话框按钮使用新字体 //如果按下cancel,则输出信息 if(ok) { ui->pushButton_3->setFont(font); } else { qDebug()<<tr("没有选择字体!"); } } //输入对话框 void Widget::on_pushButton_4_clicked() { 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); if(ok) { qDebug()<<"valuel:"<<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()<<"items:"<<item; } } //消息对话框 void Widget::on_pushButton_5_clicked() { //问题对话框 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("zyy")); } //进度对话框 void Widget::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<999999999;i++) { dialog.setValue(i);//设置进度条的当前值 QCoreApplication::processEvents();//避免页面冻结 if(dialog.wasCanceled()) { break; } dialog.setValue(999999999); qDebug()<<tr("复制结束!"); } } //错误消息对话框 void Widget::on_pushButton_7_clicked() { errordlg->setWindowTitle(tr("错误信息对话框")); errordlg->showMessage(tr("这里是出错信息!")); } //3个向导页面 QWizardPage *Widget::createPage1() { QWizardPage *page=new QWizardPage; page->setTitle(tr("介绍")); return page; } QWizardPage *Widget::createPage2() { QWizardPage *page=new QWizardPage; page->setTitle(tr("用户信息选择")); return page; } QWizardPage *Widget::createPage3() { QWizardPage *page=new QWizardPage; page->setTitle(tr("结束")); return page; } //向导对话框 void Widget::on_pushButton_8_clicked() { QWizard wizard(this); wizard.setWindowTitle(tr("向导对话框")); wizard.addPage(createPage1());//添加向导页面 wizard.addPage(createPage2()); wizard.addPage(createPage3()); wizard.exec(); }
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QErrorMessage> #include <QWizardPage> QT_BEGIN_NAMESPACE namespace Ui { class Widget;class QErrorMessage; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private slots: void on_pushButton_clicked(); void on_pushButton_2_clicked(); void on_pushButton_3_clicked(); void on_pushButton_4_clicked(); void on_pushButton_5_clicked(); void on_pushButton_6_clicked(); void on_pushButton_7_clicked(); void on_pushButton_8_clicked(); private: Ui::Widget *ui; QErrorMessage *errordlg;//错误消息对话框 //向导对话框 QWizardPage *createPage1(); QWizardPage *createPage2(); QWizardPage *createPage3(); }; #endif // WIDGET_H