QT项目:01---自定义对话框的调用

  • 本项目的基础知识来自于:https://blog.csdn.net/qq_41453285/article/details/92425420

主窗口的设计

窗口设计

  • 主窗口有4个Action对象
  • 中间部分为QTableView组件,并且将QStandardItemModel作为其数据模型,QItemSelectionModel作为其选择模型

QT项目:01---自定义对话框的调用_第1张图片

主窗口的类与构造函数

QT项目:01---自定义对话框的调用_第2张图片

QT项目:01---自定义对话框的调用_第3张图片

Action对象的设计

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

QT项目:01---自定义对话框的调用_第4张图片

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

QT项目:01---自定义对话框的调用_第5张图片QT项目:01---自定义对话框的调用_第6张图片

 

窗体类与析构函数 

QT项目:01---自定义对话框的调用_第7张图片

  • 析构函数:对话框删除时,提示对话框已被删除
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视图组件

QT项目:01---自定义对话框的调用_第8张图片QT项目:01---自定义对话框的调用_第9张图片

窗体类与构造、析构函数

QT项目:01---自定义对话框的调用_第10张图片

//构造函数
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;icolumnCount();++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”

QT项目:01---自定义对话框的调用_第11张图片QT项目:01---自定义对话框的调用_第12张图片

窗体的类

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

QT项目:01---自定义对话框的调用_第13张图片

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

待续,详情见代码samp6_2与Qt5.9C++开发指南P156

 

你可能感兴趣的:(QT项目)