Qt:对话框(QDialog)创建及其调用

一、对话框的创建

在一个应用程序中,为了实现一些特定的功能,必须自定义对话框

自定义对话框一般从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作为其选择模型

image.png

主窗口的类与构造函数

image.png

image.png

Action对象的设计

  • 创建4个Action对象,作为主窗口的工具栏按钮


image.png

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用于给主窗体设置行数和列数

image.png

窗体类与析构函数 

image.png

析构函数:对话框删除时,提示对话框已被删除

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()函数将两者关联也可以

image.png

在主窗体中调用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视图组件

image.png

窗体类与构造、析构函数

image.png

//构造函数
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对话框的信号与槽函数相同,用来当对话框调用返回时,获取对话框的返回值

image.png


在主窗体中调用QWDialogHeaders对话框

  • 该对话也为模态调用,并且在主窗口中调用第一次时创建对象,关闭之后不释放内存,等主窗体退出之后会自动执行该对话框的析构函数

  • 所以我们在主窗体的类中定义该对话框的对象,等到使用到这个对话框时再去new它

image.png

初始化主窗体的设置表头标题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”

image.png

窗体的类

  • 该窗体设置了两个公有函数,如下

image.png

在主窗口中创建调用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



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864