一、对话框的创建
在一个应用程序中,为了实现一些特定的功能,必须自定义对话框
自定义对话框一般从QDialog继承而来。当然,根据需要也可以自己设计从别的对话框继承而来
二、对话框的使用场景
定义了自己的对话框之后,对对话框的使用一般包括
在特定情境下创建生成该对话框
传递数据给对话框
获得对话框的输入数据
判断对话框单击按钮的返回类型
等等....
三、对话框的显示与删除
显示
模态对话框:当自定义对话框未关闭时,不可以对父窗口进行操作
使用:创造对话框对象后,与exec();配合使用
程序执行到exec();时,如果不对对话框进行操作,后面的代码不会执行
QDialog *dlg = new QDialog(&w);//创建对话框对象,参数:父窗口 dlg->setWindowTitle(QStringLiteral("模态对话框")); dlg->exec(); //exec:窗口等待结束(点击确定或关闭)
非模态显示:当自定义对话框未关闭时,还可以对父窗口进行操作。常用于需要进行界面交互操作的情况
使用:对话框关闭前,使用show();
QDialog *dlg = new QDialog(&w); dlg->setWindowTitle(QStringLiteral("非模态对话框")); dlg->show();
半模态对话框: 也是模态的一种,此对话框未关闭时,也不允许对此应用的其他窗口进行操作
使用:调用setModal(true);或者setWindowModality();后,然后再show();
适用于有进度条的操作
与exec();的区别:exec();需要程序返回一个值才可以继续执行后面的代码,而半模态show();函数后面的代码已经执行了
QDialog* dlg=new QDialog(&w); dlg->setWindowTitle(QStringLiteral("半模态对话框")); dlg->setModal(true); dlg->show();
删除
当自定义对话框关闭时,释放对话框对象:这种情况适用于只调用少次的对话框,释放对话框之后,释放内存
当自定义对话框关闭时,不释放对话框对象:这种情况适用于多次调用对话框,关闭之后,对话框对象仍然存在内存中,并没有释放内存。当父窗口退出时,会自动执行对话框的析构函数,释放内存
演示案例:自定义对话框的调用
主窗口的设计
窗口设计
主窗口有4个Action对象
中间部分为QTableView组件,并且将QStandardItemModel作为其数据模型,QItemSelectionModel作为其选择模型
主窗口的类与构造函数
Action对象的设计
创建4个Action对象,作为主窗口的工具栏按钮
setACellText函数
void MainWindow::setACellText(int row, int column, QString text) { QModelIndex index=theModel->index(row,column);//获得指定行、列的数据模型索引 theSelection->clearSelection();//清空原先索引 theSelection->setCurrentIndex(index,QItemSelectionModel::Select);//设置当前索引 theModel->setData(index,text,Qt::DisplayRole);//为指定索引处设置文本 }
一、自定义对话框QWDialogSize的创建与使用
窗体的创建与设计:
菜单选项“File”==>"New File or Project"==>选择“QT分类下”的“Qt Designer Form Class”创建可视化设置的对话框类==>选择“Dialog without Buttons”==>设计窗体类名为“QWDialogSize”
窗体有两个QSpinBox用于给主窗体设置行数和列数
窗体类与析构函数
析构函数:对话框删除时,提示对话框已被删除
QWDialogSize::~QWDialogSize() { QMessageBox::information(this,QStringLiter("提示"),QStringLiteral("对话框已被删除")); delete ui; }
返回行数、列数,以及设置行数列数函数
int QWDialogSize::rowCount() { return ui->spinBoxRow->value(); } int QWDialogSize::columnCount() { return ui->spinBoxColumn->value(); } void QWDialogSize::setRowColumn(int row, int column) { ui->spinBoxRow->setValue(row); ui->spinBoxColumn->setValue(column); }
信号与槽函数的创建
当点击确定按钮时,触发QWDialogSize窗体的accept()槽函数。当点击确定按钮之后对话框就会退出,“QDialog::Accepted”常量会作为对话框类对象exec()函数的返回值,主窗体可以根据该值来判断对话框是如何退出返回的
当点击取消按钮时,触发QWDialogSize窗体的reject()槽函数。同上,点击取消对话框退出后,“QDialog::Rejected”作为exec()函数的返回值
备注:或者你直接在构造函数中使用connection()函数将两者关联也可以
在主窗体中调用QWDialogSize对话框
初始化主窗体的设置行数列数Action按钮的triggered槽函数,在里面创建QWDialogSize对话框,并且进行设置
QWDialogSize对话框创建一次,使用之后就立即删除,并且以模式的方式显示
void MainWindow::on_act_rowcolnum_triggered() { QWDialogSize* dlgTableSize=new QWDialogSize(); Qt::WindowFlags flags=dlgTableSize->windowFlags();//获得窗体属性 //设置窗体属性(在Windows下,使窗体具有更窄的边框,用于固定大小的对抗画框) dlgTableSize->setWindowFlags(flags|Qt::MSWindowsFixedSizeDialogHint); //用当前数据模型的行数和列数,初始化QWDialogSize对话框的两个QSpinBox的值 dlgTableSize->setRowColumn(theModel->rowCount(),theModel->columnCount()); int ret=dlgTableSize->exec();//模式显示对话框,并且程序处于阻塞 if(ret==QDialog::Accepted)//如果点击了确定按钮 { //得到QSpinBox的值,并且为数据模型设置行数和列数 int cols=dlgTableSize->colorCount(); int rows=dlgTableSize->rowCount(); theModel->setColumnCount(cols); theModel->setRowCount(rows); } else if(ret=QDialog::Rejected)//如果点击的是取消按钮 { delete dlgTableSize;//释放对话框对象并退出 return; } delete dlgTableSize;//释放对话框对象 }
二、自定义对话框QWDialogHeaders的创建与使用
窗体的创建与设计:
菜单选项“File”==>"New File or Project"==>选择“QT分类下”的“Qt Designer Form Class”创建可视化设置的对话框类==>选择“Dialog without Buttons”==>设计窗体类名为“QWDialogHeaders”
主窗体中心是一个QListView视图组件
窗体类与构造、析构函数
//构造函数 QWDialogHeaders::QWDialogHeaders(QWidget *parent) : QDialog(parent), ui(new Ui::QWDialogHeaders) { ui->setupUi(this); //构造QStringListModel数据模型,并将其结合给QLsitView组件 model=new QStringListModel; ui->listView->setModel(model); } //析构函数 QWDialogHeaders::~QWDialogHeaders() { QMessageBox::information(this,QStringLiteral("提示"),QStringLiteral("对话框已被删除")); delete ui; }
设置/返回数据模型内容的两个自定义函数
void QWDialogHeaders::setHeaderList(QStringList &headers) { model->setStringList(headers); } QStringList QWDialogHeaders::headerList() { return model->stringList(); }
信号与槽函数的创建
与QWDialogSize对话框的信号与槽函数相同,用来当对话框调用返回时,获取对话框的返回值
在主窗体中调用QWDialogHeaders对话框
该对话也为模态调用,并且在主窗口中调用第一次时创建对象,关闭之后不释放内存,等主窗体退出之后会自动执行该对话框的析构函数
所以我们在主窗体的类中定义该对话框的对象,等到使用到这个对话框时再去new它
初始化主窗体的设置表头标题Action的triggered函数
void MainWindow::on_act_title_triggered() { if(dlgSetHeaders==NULL)//如果是第一次调用,初始化 dlgSetHeaders=new QWDialogHeaders(this); //该for循环用来初始化dlgSetHeaders对话框的列表 if(dlgSetHeaders->headerList().count()!=theModel->columnCount()) { QStringList strList;//用来保存表头标题 for(int i=0;i<theModel->columnCount();++i)//循环获取数据模型的列 strList.append(theModel->headerData(i,Qt::Horizontal,//将每一个表头标题存放在strList中 Qt::DisplayRole).toString()); dlgSetHeaders->setHeaderList(strList);//为dlgSetHeaders对话框初始化内容 } int ret=dlgSetHeaders->exec();//模态执行对话框 if(ret==QDialog::Accepted)//如果点击了确定按钮 { //获得对话框的列表,并且为数据模型设置表头 QStringList strList=dlgSetHeaders->headerList(); theModel->setHorizontalHeaderLabels(strList); } }
三、自定义对话框QWDialogLocate的创建与使用
窗体的创建与设计:
菜单选项“File”==>"New File or Project"==>选择“QT分类下”的“Qt Designer Form Class”创建可视化设置的对话框类==>选择“Dialog without Buttons”==>设计窗体类名为“QWDialogLocate”
窗体的类
该窗体设置了两个公有函数,如下
在主窗口中创建调用QWDialogLocate对话框
初始化主窗口中定位单元格Action按钮的triggered函数
调用该函数初始化对话框。并且以非模态显示,这样主窗口与对话框就可以进行数据的交互
void MainWindow::on_act_cell_triggered() { ui->act_cell->setEnabled(false);//单元格Action点击调出对话框之后就不能再点击 dlgLocate=new QWDialogLocate(this);//构造对话框 dlgLocate->setAttribute(Qt::WA_DeleteOnClose);//设置对话框关闭时自动删除 Qt::WindowFlags flags=dlgLocate->windowFlags();//获得对话框属性 //设置对话框属性(WindowStaysOnTopHint窗体总是显示最上方) dlgLocate->setWindowFlags(flags|Qt::WindowStaysOnTopHint); //设置对话框中两个spinBox控件显示的最大值为QStandardItemModel数据模型的行数和列数 dlgLocate->setSpinRange(theModel->rowCount(),theModel->columnCount()); QModelIndex curIndex=theSelection->currentIndex();//获得鼠标当前点击的数据模型索引 if(curIndex.isValid()) dlgLocate->setSpinValue(curIndex.row(),curIndex.column());//为对话框的两个spinBox控件初始化值 dlgLocate->show();//对话框非模态实现 }
对话框中“设定文字”按钮的clicked函数
void QWDialogLocate::on_btnSetText_clicked() { //获得对话框中两个spinBox的值 int row=ui->spinBoxRow->value(); int col=ui->spinBoxColumn->value(); MainWindow *parWind=(MainWindow*)parentWidget();//获取主窗口 //调用主窗口自定义函数,设置指定行、列单元格的文本 parWind->setACellText(row,col,ui->edtCaption->text()); if(ui->chkBoxRow->isCheckable())//如果行增被勾选,spinBox的值加1 ui->spinBoxRow->setValue(1+ui->spinBoxRow->value()); if(ui->chkBoxColumn->isCheckable())//同上 ui->spinBoxColumn->setValue(1+ui->spinBoxColumn->value()); }
主窗体与对话框的交互函数
主窗体中tabView数据模型的clocked槽函数,点击之后会将当前数据模型索引显示在QWDialogLocate对话框的spinBox控件中
void MainWindow::on_tableView_clicked(const QModelIndex &index) { //将当前鼠标所指的数据模型索引显示在QWDialogLocate对话框的两个spinBox控件中 if(dlgLocate!=NULL) dlgLocate->setSpinValue(index.row(),index.column()); }
QWDialogLocate对话框的setSpinValue函数
void QWDialogLocate::setSpinValue(int rowNo, int colNo) { ui->spinBoxRow->setValue(rowNo); ui->spinBoxColumn->setValue(colNo); }
————————————————
版权声明:本文为CSDN博主「江南、董少」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41453285/article/details/94830478

