Qt第十五天

自定义对话框及其调用

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 &current, 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 &current, 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());
}




猜你喜欢

转载自blog.csdn.net/theRookie1/article/details/84997757