Qt第十五天 以你之姓@ 2022-04-08 12:41 300阅读 0赞 # 自定义对话框及其调用 # ## 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()); }
相关 QT第五天 时间日期与定时器 时间日期相关的类 ([https://blog.csdn.net/theRookie1/article/details/84672489][htt 缺乏、安全感/ 2022年04月12日 04:50/ 0 赞/ 395 阅读
相关 QT第十天 QFileSystemModel 使用QFileSystemModel作为数据模型,QTreeView,QListView和QTableView为主要组件 在Tree Bertha 。/ 2022年04月11日 11:42/ 0 赞/ 340 阅读
相关 Qt第十五天 自定义对话框及其调用 QWDialogSize的创建 qwdialogsize.h ifndef QWDIALOGSIZE_H define QW 以你之姓@/ 2022年04月08日 12:41/ 0 赞/ 301 阅读
相关 Qt第十二天 QStandardItemModel的使用 实现功能: 打开一个文本文件,该文件为二维数据文件,通过字符串处理获取表头和各行各列数据,导入到QStandardItem Bertha 。/ 2022年04月08日 10:15/ 0 赞/ 459 阅读
相关 Qt第十一天 QStringListModel的使用 采用QStringListModel作为数据模型,QListView组件作为视图组件 演示了QStringListModel和 痛定思痛。/ 2022年04月08日 09:22/ 0 赞/ 279 阅读
相关 Qt第十三天 自定义代理 \\基类为QItemDelegate, 必须实现4个函数 //自定义代理组件必须继承一下四个函数,函数的原型都是固定的 //创建编辑组件 QW た 入场券/ 2022年04月05日 07:09/ 0 赞/ 441 阅读
相关 Qt第十八天 Graphics View绘图程序实例 \\可以创建矩形,椭圆,圆,三角形,梯形,直线,文字等基本图形项 每个图形项可以被选择,拖动,放缩,旋转 图形项的前置和后 逃离我推掉我的手/ 2022年04月04日 11:47/ 0 赞/ 390 阅读
相关 Qt第十七天 QGraphicsView程序基本结构和功能实现 mainwindow.h ifndef MAINWINDOW_H define MAINWINDOW_ 快来打我*/ 2022年04月04日 09:18/ 0 赞/ 325 阅读
相关 Qt第十六天’ 坐标变换 坐标平移 坐标旋转 坐标缩放 状态的保存和恢复 widget.h ifndef WIDGET_H define WIDGET 快来打我*/ 2022年04月04日 03:07/ 0 赞/ 306 阅读
相关 Qt第二十五天 qwt绘制动态折线图 mainwindow.h ifndef MAINWINDOW_H define MAINWINDOW_H 亦凉/ 2022年04月02日 19:42/ 0 赞/ 248 阅读
还没有评论,来说两句吧...