目录
三 窗口部件
1.QWidget
1.1 窗口与子部件
2.QDialog
2.1 模态和非模态对话框
2.2 初始信号和槽并实现多窗口切换
1) 定义信号和槽
2) 自动定义对话框
3) 标准对话框
a.颜色对话框
b.文件对话框
c.字体对话框
d.输入对话框
e.消息对话框
f.进度对话框
g.错误消息对话框
h.向导对话框
*完整代码
widget:用户界面最基本的组成部分,它接收来自于windows系统的鼠标、键盘以及其他事件,然后将它自己绘制在屏幕上。
分类:
1.顶级widget:没有父类的独立窗口。
2.子widget:作为子部件在父类中显示。
3.复合型Widget:把一个widget作为一个容器来存放一组子widget。
main.cpp
#include 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
模块对话框:
在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭。
//非模态对话框: //对话框弹出来,但mywidget窗口并没有出来 #include"ui_widget.h" #include#include "widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); //QDialog *dialog=new QDialog(this); //dialog->show(); //或者 QDialog dialog(this); //定义QDialog对象 dialog.exec(); } Widget::~Widget() { delete ui; }
非模块对话框:
对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互。
//模式对话框 //对话框与widget一起出来 #include "widget.h" #include#include"ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); QDialog *dialog=new QDialog(this); dialog->setModal(true);//表示是模式对话框 dialog->show(); } Widget::~Widget() { delete ui; }
信号和槽都是函数,用于完成对象间的协同操作。
步骤
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); }
#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 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 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; //退出程序 } }
//颜色对话框 void Widget::on_pushButton_clicked() { QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框")); qDebug()<<"color:"<b.文件对话框
//文件对话框 void Widget::on_pushButton_2_clicked() { // //读取单个文件 // QString filename=QFileDialog::getOpenFileName(this,tr("文件对话框"), // "D:\photo",tr("图片文件(*.jpg *.png)")); // qDebug()<<"fileName:"<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()<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:"<e.消息对话框
//消息对话框 void Widget::on_pushButton_5_clicked() { //问题对话框 int ret1=QMessageBox::question(this,tr("问题对话框"), tr("你了解Qt吗?"),QMessageBox::Yes,QMessageBox::No); if(ret1==QMessageBox::Yes) { qDebug()<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()<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:"<pushButton_3->setFont(font); } else { qDebug()< 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#include #include 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