一、对话框的创建
在一个应用程序中,为了实现一些特定的功能,必须自定义对话框
自定义对话框一般从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


少有人走的路



















