自定义对话框及其调用
QWDialogSize的创建
qwdialogsize.h
#ifndef QWDIALOGSIZE_H
#define QWDIALOGSIZE_H
#include <QDialog>
namespace Ui {
class QWDialogSize;
}
class QWDialogSize : public QDialog
{
Q_OBJECT
//自定义函数用于与对话框调用者交互
public:
int rowCount();//获取行数
int columnCount();//获取列数
void setRowColumn(int row,int column);//设置行数列数
public:
explicit QWDialogSize(QWidget *parent = nullptr);
~QWDialogSize();
private:
Ui::QWDialogSize *ui;
};
#endif // QWDIALOGSIZE_H
qwdialogsize.cpp
#include "qwdialogsize.h"
#include "ui_qwdialogsize.h"
#include<QMessageBox>
QWDialogSize::QWDialogSize(QWidget *parent) :
QDialog(parent),
ui(new Ui::QWDialogSize)
{
ui->setupUi(this);
}
QWDialogSize::~QWDialogSize()
{
QMessageBox::information(this,"提示","设置行列对话框已删除");
delete ui;
}
int QWDialogSize::rowCount()
{
int row;
row=ui->spinBoxRow->value();
return row;
}
int QWDialogSize::columnCount()
{
int column;
column=ui->spinBoxColumn->value();
return column;
}
void QWDialogSize::setRowColumn(int row, int column)
{
ui->spinBoxRow->setValue(row);
ui->spinBoxColumn->setValue(column);
}
QWDialogHeaders的创建
qwdialogheaders.h
#ifndef QWDIALOGHEADERS_H
#define QWDIALOGHEADERS_H
#include <QDialog>
#include<QStringListModel>
namespace Ui {
class QWDialogHeaders;
}
class QWDialogHeaders : public QDialog
{
Q_OBJECT
private:
QStringListModel *model;//管理字符串列表数据
//自定义函数
public:
void setHeaderList(QStringList &headers);
QStringList headerList();
public:
explicit QWDialogHeaders(QWidget *parent = nullptr);
~QWDialogHeaders();
private:
Ui::QWDialogHeaders *ui;
};
#endif // QWDIALOGHEADERS_H
qwdialogheaders.cpp
#include "qwdialogheaders.h"
#include "ui_qwdialogheaders.h"
#include<QMessageBox>
QWDialogHeaders::QWDialogHeaders(QWidget *parent) :
QDialog(parent),
ui(new Ui::QWDialogHeaders)
{
ui->setupUi(this);
model= new QStringListModel;
ui->listView->setModel(model);
}
QWDialogHeaders::~QWDialogHeaders()
{
QMessageBox::information(this,"提示","设置表头对话框被删除");
delete ui;
}
void QWDialogHeaders::setHeaderList(QStringList &headers)//初始化数据模型的字符串列表
{
model->setStringList(headers);
}
QStringList QWDialogHeaders::headerList()//返回字符串列表
{
return model->stringList();
}
QWDialogLocate的创建
qwdialoglocate.h
#ifndef QWDIALOGLOCATE_H
#define QWDIALOGLOCATE_H
#include <QDialog>
namespace Ui {
class QWDialogLocate;
}
class QWDialogLocate : public QDialog
{
Q_OBJECT
private:
void closeEvent(QCloseEvent *event);
void showEvent(QShowEvent *event);
public:
void setSpinRange(int rowCount, int colCount); //设置最大值
void setSpinValue(int rowNo, int colNo);//设置初始值
private slots:
void on_btnSetText_clicked();
public:
explicit QWDialogLocate(QWidget *parent = nullptr);
~QWDialogLocate();
private:
Ui::QWDialogLocate *ui;
};
#endif // QWDIALOGLOCATE_H
qwdialoglocate.cpp
#include "qwdialoglocate.h"
#include "ui_qwdialoglocate.h"
#include"mainwindow.h"
#include<QCloseEvent>
QWDialogLocate::QWDialogLocate(QWidget *parent) :
QDialog(parent),
ui(new Ui::QWDialogLocate)
{
ui->setupUi(this);
}
QWDialogLocate::~QWDialogLocate()
{
delete ui;
}
void QWDialogLocate::closeEvent(QCloseEvent *event)
{
MainWindow *parWind=(MainWindow*)parentWidget();//获取主窗口指针
parWind->setActLocateEnable(true);//使能actTab_Locate
parWind->setDlgLocateNull(); //将窗口指针设置为NULL
}
void QWDialogLocate::showEvent(QShowEvent *event)//窗口显示事件
{
MainWindow *parWind = (MainWindow*)parentWidget();//获取
parWind->setActLocateEnable(false);//actTab_Locate不可用
}
void QWDialogLocate::setSpinRange(int rowCount, int colCount)//设置SpinBox输入最大值
{
ui->spinBoxRow->setMaximum(rowCount-1);
ui->spinBoxColumn->setMaximum(colCount-1);
}
void QWDialogLocate::setSpinValue(int rowNo, int colNo)//设置SpinBox数值
{
ui->spinBoxRow->setValue(rowNo);
ui->spinBoxColumn->setValue(colNo);
}
void QWDialogLocate::on_btnSetText_clicked()//设定文字
{
int row=ui->spinBoxRow->value(); //行号
int col=ui->spinBoxColumn->value();//列号
MainWindow *parWind = (MainWindow*)parentWidget(); //获取主窗口
parWind->setACellText(row,col,ui->edtCaption->text()); //设置单元格文字
if (ui->chkBoxRow->isChecked()) //行增
ui->spinBoxRow->setValue(1+ui->spinBoxRow->value());
if (ui->chkBoxColumn->isChecked()) //列增
ui->spinBoxColumn->setValue(1+ui->spinBoxColumn->value());
}
主窗口的创建
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QDialog>
#include<QLabel>
#include<QStandardItemModel>
#include<QItemSelectionModel>
#include<QMessageBox>
#include<QCloseEvent>
#include"qwdialogsize.h"
#include"qwdialogheaders.h"
#include"qwdialoglocate.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
//用于状态栏的信息显示
QLabel *LabCellPos; //当前单元格行列号
QLabel *LabCellText; //当前单元格内容
private:
QStandardItemModel *theModel;//数据模型
QItemSelectionModel *theSelection;//Item选择模型
QWDialogHeaders *dlgSetHeaders=nullptr;//用于判断此对话框是否创建
QWDialogLocate *dlgLocate=nullptr;//为了在主窗口中也能操作对话框,需要保留对话框实例对象名
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void closeEvent(QCloseEvent *event);//关闭窗口时间,可以询问是否退出
private slots:
void on_actTab_SetSize_triggered();
void on_actTab_SetHeader_triggered();
void on_actTab_Locate_triggered();
void on_currentChanged(const QModelIndex ¤t, const QModelIndex &previous);
void on_tableView_clicked(const QModelIndex &index);
public:
void setActLocateEnable(bool enable);//设置actTab_Locate的enabled属性
void setACellText(int row,int column,QString text);//设置一个单元格的内容,由dlgLocate调用
void setDlgLocateNull();//将dlgLocate指针设置为NULL
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
theModel = new QStandardItemModel(10,5,this); //创建数据模型
theSelection = new QItemSelectionModel(theModel);//Item选择模型
connect(theSelection,SIGNAL(currentChanged(QModelIndex,QModelIndex)),this,SLOT(on_currentChanged(QModelIndex,QModelIndex)));
//为tableView设置数据模型
ui->tableView->setModel(theModel); //设置数据模型
ui->tableView->setSelectionModel(theSelection);//设置选择模型
setCentralWidget(ui->tableView); //
//创建状态栏组件
LabCellPos = new QLabel("当前单元格:",this);
ui->statusBar->addWidget(LabCellPos);
LabCellPos->setMinimumWidth(180);
LabCellPos->setAlignment(Qt::AlignHCenter);
LabCellText = new QLabel("单元格内容:",this);
ui->statusBar->addWidget(LabCellText);
LabCellText->setMinimumWidth(200);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_actTab_SetSize_triggered()//设置行列数
{
//模态对话框,动态创建,用过后删除
QWDialogSize *dlgTableSize=new QWDialogSize(this);
Qt::WindowFlags flags=dlgTableSize->windowFlags();//获取已有flags
dlgTableSize->setWindowFlags(flags|Qt::MSWindowsFixedSizeDialogHint);//设为固定大小
dlgTableSize->setRowColumn(theModel->rowCount(),theModel->columnCount());//将主窗口的数据模型的行列显示在对话框中
int ret=dlgTableSize->exec();//以模态方式显示对话框
if(ret==QDialog::Accepted)//如果按下确定按钮
{
int row=dlgTableSize->rowCount();
int column=dlgTableSize->columnCount();
theModel->setRowCount(row);
theModel->setColumnCount(column);
}
delete dlgTableSize;//删除对话框
}
void MainWindow::on_actTab_SetHeader_triggered()//一次创建,多次调用,对话框关闭时只是隐藏
{
if (dlgSetHeaders==nullptr) //如果对象没有被创建过,就创建对象
dlgSetHeaders = new QWDialogHeaders(this);//传递主窗口的指针作为对话框的父对象,只有在主窗口被释放时才会删除此对话框
if (dlgSetHeaders->headerList().count()!=theModel->columnCount())
{//如果表头列数变化,重新初始化
QStringList strList;
for (int i=0;i<theModel->columnCount();i++)//获取现有的表头标题
strList.append(theModel->headerData(i,Qt::Horizontal,Qt::DisplayRole).toString());
dlgSetHeaders->setHeaderList(strList);//用于对话框初始化显示
}
int ret=dlgSetHeaders->exec();// 以模态方式显示对话框
if (ret==QDialog::Accepted) //确认键被按下
{
QStringList strList=dlgSetHeaders->headerList();//获取对话框上修改后的StringList
theModel->setHorizontalHeaderLabels(strList);// 设置模型的表头标题
}
}
void MainWindow::on_actTab_Locate_triggered() //创建 StayOnTop的对话框,对话框关闭时自动删除
{
//通过控制actTab_Locate的enable属性避免重复点击
ui->actTab_Locate->setEnabled(false);
dlgLocate = new QWDialogLocate(this); //创建对话框,传递指针
dlgLocate->setAttribute(Qt::WA_DeleteOnClose); //对话框关闭时自动删除对话框对象,用于不需要读取返回值的对话框
Qt::WindowFlags flags=dlgLocate->windowFlags(); //获取已有flags
//对话框设置为固定大小和StayOnTop
dlgLocate->setWindowFlags(flags | Qt::WindowStaysOnTopHint); //设置对话框固定大小,StayOnTop
//对话框初始化设置
dlgLocate->setSpinRange(theModel->rowCount(),theModel->columnCount());
QModelIndex curIndex=theSelection->currentIndex();
if (curIndex.isValid())
dlgLocate->setSpinValue(curIndex.row(),curIndex.column());
dlgLocate->show(); //非模态显示对话框
}
void MainWindow::closeEvent(QCloseEvent *event)
{ //窗口关闭时询问是否退出
QMessageBox::StandardButton result=QMessageBox::question(this, "确认", "确定要退出本程序吗?",
QMessageBox::Yes|QMessageBox::No |QMessageBox::Cancel,//设置三个按钮
QMessageBox::Yes);//默认选中yes按钮
if (result==QMessageBox::Yes)
event->accept();
else
event->ignore();
}
void MainWindow::setActLocateEnable(bool enable)
{
ui->actTab_Locate->setEnabled(enable);
}
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);//设置单元格字符串
}
void MainWindow::setDlgLocateNull()
{
dlgLocate=nullptr;
}
void MainWindow::on_currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
{
Q_UNUSED(previous);
if (current.isValid()) //当前模型索引有效
{
LabCellPos->setText(QString::asprintf("当前单元格:%d行,%d列",current.row(),current.column())); //显示模型索引的行和列号
QStandardItem *aItem;
aItem=theModel->itemFromIndex(current); //从模型索引获得Item
this->LabCellText->setText("单元格内容:"+aItem->text()); //显示item的文字内容
}
}
void MainWindow::on_tableView_clicked(const QModelIndex &index)
{//单击单元格时,将单元格的行号、列号设置到对话框上
if (dlgLocate!=nullptr) //对话框存在
dlgLocate->setSpinValue(index.row(),index.column());
}