QT系列第8节 自定义对话框

       在实际业务开发中经常要有各种各样的对话框来处理用户信息,本节就结合例子来说明如何自定义对话框。

目录

1.创建对话框

2.创建非模态对话框

3.创建模态对话框

4.综合案例


1.创建对话框

(1)项目鼠标右键菜单 - 添加新文件

(2) 左侧选择 Qt,右侧选择Qt设计器界面类

(3)一般选择 Dialog without Buttons

 (4) 输入我们要定义的对话框类名,其他名字根据输入类名调整,可以不修改

(5)选择完成

 (6)进入了ui设计器面板

 (7)进入编辑tab页中就能看到新增加的三个文件

2.创建非模态对话框

如下方式可以创建和现实一个对话框

 QDialogLocate *dialogLocate = new  QDialogLocate(this);
 //设置属性:关闭时候删除
 dialogLocate->setAttribute(Qt::WA_DeleteOnClose); 
 Qt::WindowFlags flags = dialogLocate->windowFlags();
 dialogLocate->setWindowFlags(flags|Qt::WindowStaysOnTopHint);

 //非模态对话框显示
 dialogLocate->show();

3.创建模态对话框

       如下方式可以创建和销毁一个模态对话框。

DialogSetSie *dlg = new DialogSetSie(this);
dlg->SetRowsColumns(theModel->rowCount(), theModel->columnCount());
int ret = dlg->exec();
if (QDialog::Accepted == ret) {
    ...   
}
delete dlg;

4.综合案例

       以下综合案例创建一个主对话框,主对话框有一个tableview,上面工具栏可以弹出对话框用来设置主对话框中tableview的属性,并且支持通过Model来修改tableview显示内容。

(1)主对话框中tablevview设置Model

 theModel = new QStandardItemModel(this);
    theSelection = new QItemSelectionModel(theModel);
    ui->tableView->setModel(theModel);
    ui->tableView->setSelectionModel(theSelection); theModel = new QStandardItemModel(this);
    theSelection = new QItemSelectionModel(theModel);
    ui->tableView->setModel(theModel);
    ui->tableView->setSelectionModel(theSelection);

(2)设置tablevview行和列的对话两

dialogsetsie.h

#ifndef DIALOGSETSIE_H
#define DIALOGSETSIE_H

#include <QDialog>

namespace Ui {
class DialogSetSie;
}

class DialogSetSie : public QDialog
{
    Q_OBJECT

public:
    explicit DialogSetSie(QWidget *parent = nullptr);
    ~DialogSetSie();
    void SetRowsColumns(int row, int column);
    int columnCount();
    int rowCount();

private slots:
    void on_pushButtonCancel_clicked();

    void on_pushButtonOk_clicked();

private:
    Ui::DialogSetSie *ui;
};

#endif // DIALOGSETSIE_H

dialogsetsie.cpp

#include "dialogsetsie.h"
#include "ui_dialogsetsie.h"

#include <QMessageBox>

DialogSetSie::DialogSetSie(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogSetSie)
{
    ui->setupUi(this);
}

DialogSetSie::~DialogSetSie()
{
    QMessageBox::information(this, "", "设置大小对话框已退出");
    delete ui;
}

void DialogSetSie::SetRowsColumns(int row, int column) {
    ui->spinBoxColumn->setValue(column);
    ui->spinBoxLine->setValue(row);
}

int DialogSetSie::columnCount() {
    return ui->spinBoxColumn->value();
}

int DialogSetSie::rowCount() {
    return ui->spinBoxLine->value();
}

void DialogSetSie::on_pushButtonCancel_clicked()
{

}


void DialogSetSie::on_pushButtonOk_clicked()
{

}

(3)设置tablevview表头对话框

dialogsetheaders.h

#ifndef DIALOGSETHEADERS_H
#define DIALOGSETHEADERS_H

#include <QDialog>
#include <QStringListModel>

namespace Ui {
class DialogSetHeaders;
}

class DialogSetHeaders : public QDialog
{
    Q_OBJECT
private:
    QStringListModel *theModel;

public:
    explicit DialogSetHeaders(QWidget *parent = nullptr);
    ~DialogSetHeaders();

    void setStringList(QStringList strList);
    QStringList stringList();

private slots:
    void on_pushButtonOk_clicked();

    void on_pushButtonCancel_clicked();

private:
    Ui::DialogSetHeaders *ui;
};

#endif // DIALOGSETHEADERS_H
#ifndef DIALOGSETHEADERS_H
#define DIALOGSETHEADERS_H

#include <QDialog>
#include <QStringListModel>

namespace Ui {
class DialogSetHeaders;
}

class DialogSetHeaders : public QDialog
{
    Q_OBJECT
private:
    QStringListModel *theModel;

public:
    explicit DialogSetHeaders(QWidget *parent = nullptr);
    ~DialogSetHeaders();

    void setStringList(QStringList strList);
    QStringList stringList();

private slots:
    void on_pushButtonOk_clicked();

    void on_pushButtonCancel_clicked();

private:
    Ui::DialogSetHeaders *ui;
};

#endif // DIALOGSETHEADERS_H

dialogsetheaders.cpp

#include "dialogsetheaders.h"
#include "ui_dialogsetheaders.h"
#include <QMessageBox>

DialogSetHeaders::DialogSetHeaders(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogSetHeaders)
{
    ui->setupUi(this);
    theModel = new QStringListModel(this);
    ui->listView->setModel(theModel);
}

DialogSetHeaders::~DialogSetHeaders()
{
    QMessageBox::information(this, "", "设置表头对话框退出");
    delete ui;
}

void DialogSetHeaders::setStringList(QStringList strList)
{
    theModel->setStringList(strList);
}

QStringList DialogSetHeaders::stringList()
{
    return theModel->stringList();
}

void DialogSetHeaders::on_pushButtonOk_clicked()
{
    emit accept();
}


void DialogSetHeaders::on_pushButtonCancel_clicked()
{
    emit reject();
}

#include "dialogsetheaders.h"
#include "ui_dialogsetheaders.h"
#include <QMessageBox>

DialogSetHeaders::DialogSetHeaders(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogSetHeaders)
{
    ui->setupUi(this);
    theModel = new QStringListModel(this);
    ui->listView->setModel(theModel);
}

DialogSetHeaders::~DialogSetHeaders()
{
    QMessageBox::information(this, "", "设置表头对话框退出");
    delete ui;
}

void DialogSetHeaders::setStringList(QStringList strList)
{
    theModel->setStringList(strList);
}

QStringList DialogSetHeaders::stringList()
{
    return theModel->stringList();
}

void DialogSetHeaders::on_pushButtonOk_clicked()
{
    emit accept();
}


void DialogSetHeaders::on_pushButtonCancel_clicked()
{
    emit reject();
}

(4)修改tablevview单元格对话框

qdialoglocate.h

#ifndef QDIALOGLOCATE_H
#define QDIALOGLOCATE_H

#include <QDialog>

namespace Ui {
class QDialogLocate;
}

class QDialogLocate : public QDialog
{
    Q_OBJECT

public:
    explicit QDialogLocate(QWidget *parent = nullptr);
    ~QDialogLocate();

    void setRange(int rows, int cols);
    void setValue(int rows, int cols);
    void closeEvent(QCloseEvent *event);

private slots:
    void on_pushButtonText_clicked();

    void on_pushButtonClose_clicked();

signals:
    void changeCellText(int, int, QString);

private:
    Ui::QDialogLocate *ui;
};

#endif // QDIALOGLOCATE_H

qdialoglocate.cpp

#include "qdialoglocate.h"
#include "ui_qdialoglocate.h"
#include "mainwindow.h"
#include <QMessageBox>

QDialogLocate::QDialogLocate(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QDialogLocate)
{
    ui->setupUi(this);
}

QDialogLocate::~QDialogLocate()
{
    QMessageBox::information(this, "提示", "设置单元格被关闭");
    delete ui;
}

void QDialogLocate::setRange(int rows, int cols) {
    ui->spinBoxRow->setRange(0, rows-1);
    ui->spinBoxColumn->setRange(0, cols -1);

}

void QDialogLocate::setValue(int rows, int cols) {
    ui->spinBoxRow->setValue(rows);
    ui->spinBoxColumn->setValue(cols);
}

void QDialogLocate::closeEvent(QCloseEvent *event)
{
    MainWindow *mainWnd = (MainWindow *)parentWidget();
    mainWnd->setActLocateEnable(true);
}

void QDialogLocate::on_pushButtonText_clicked()
{
    int row = ui->spinBoxRow->value();
    int col = ui->spinBoxColumn->value();
    /*
    MainWindow *mainWnd = (MainWindow *)parentWidget();
    mainWnd->setCellText(row, col, ui->lineEditText->text());
    */
    emit changeCellText(row, col, ui->lineEditText->text());
    if (ui->checkBoxAddRow->isChecked()) {
        ui->spinBoxRow->setValue(ui->spinBoxRow->value() + 1);
    }
    if (ui->checkBoxAddCol->isChecked()) {
        ui->spinBoxColumn->setValue(ui->spinBoxColumn->value() + 1);
    }
}


void QDialogLocate::on_pushButtonClose_clicked()
{
    close();
}

(5) 主窗口

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include "dialogsetheaders.h"
#include "qdialoglocate.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    QStandardItemModel  *theModel;
    QItemSelectionModel *theSelection;
    DialogSetHeaders *dialogHeder;
    QDialogLocate   *dialogLocate = NULL;

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void setActLocateEnable(bool enable);
    void setActLocateNull();

private slots:
    void on_actionCut_triggered();

    void on_actionSetLineColumn_triggered();

    void on_actionHeadTitle_triggered();

    void on_actionQuit_triggered();

    void on_actionSetRect_triggered();

    void on_tableView_clicked(const QModelIndex &index);

    void setCellText(int row, int col, QString text);

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogsetsie.h"
#include <QStringList>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    theModel = new QStandardItemModel(this);
    theSelection = new QItemSelectionModel(theModel);
    ui->tableView->setModel(theModel);
    ui->tableView->setSelectionModel(theSelection);
    dialogHeder = nullptr;
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::setActLocateEnable(bool enable)
{
    ui->actionSetRect->setEnabled(enable);
}

void MainWindow::setActLocateNull() {
    dialogLocate = nullptr;
}

void MainWindow::setCellText(int row, int col, QString text)
{
    QModelIndex index = theModel->index(row, col);
    theModel->setData(index, text, Qt::DisplayRole);
    theSelection->clearSelection();
    theSelection->setCurrentIndex(index, QItemSelectionModel::Select);
}

void MainWindow::on_actionCut_triggered()
{
    this->close();
}


void MainWindow::on_actionSetLineColumn_triggered()
{
    DialogSetSie *dlg = new DialogSetSie(this);
    dlg->SetRowsColumns(theModel->rowCount(), theModel->columnCount());
    int ret = dlg->exec();
    if (QDialog::Accepted == ret) {
        int row = dlg->rowCount();
        int col = dlg->columnCount();
        theModel->setColumnCount(col);
        theModel->setRowCount(row);
    }
    delete dlg;
}


void MainWindow::on_actionHeadTitle_triggered()
{
    if (!dialogHeder) {
        dialogHeder = new DialogSetHeaders(this);
    }
    if (dialogHeder->stringList().count() != theModel->columnCount()) {
        QStringList strList;
        for (int i=0; i<theModel->columnCount(); i++) {
            //strList.append(theModel->headerData(i, Qt::Horizontal));
            strList << theModel->headerData(i, Qt::Horizontal).toString();
        }
        dialogHeder->setStringList(strList);
    }
    //模态对话框显示
    int ret = dialogHeder->exec();
    if (QDialog::Accepted == ret) {
        QStringList strList = dialogHeder->stringList();
        theModel->setHorizontalHeaderLabels(strList);
    }
}


void MainWindow::on_actionQuit_triggered()
{
    this->close();
}


void MainWindow::on_actionSetRect_triggered()
{
    ui->actionSetRect->setDisabled(true);
    dialogLocate = new  QDialogLocate(this);
    dialogLocate->setAttribute(Qt::WA_DeleteOnClose);
    Qt::WindowFlags flags = dialogLocate->windowFlags();
    dialogLocate->setWindowFlags(flags|Qt::WindowStaysOnTopHint);
    dialogLocate->setRange(theModel->rowCount(), theModel->columnCount());
    QModelIndex curIndex = theSelection->currentIndex();
    if (curIndex.isValid()) {
        dialogLocate->setValue(curIndex.row(), curIndex.column());
    }
    connect(dialogLocate, SIGNAL(changeCellText(int, int, QString)), this, SLOT(setCellText(int, int, QString)));
    //connect(dialogLocate, &QDialogLocate::changeCellText, this, &MainWindow::setCellText);
    //非模态对话框显示
    dialogLocate->show();
}


void MainWindow::on_tableView_clicked(const QModelIndex &index)
{
    if (NULL != dialogLocate) {
        dialogLocate->setValue(index.row(), index.column());
    }
}

(6) 效果展示

设置五行三列

 

修改表头:

 

 

 修改单元格:

完整代码下载地址:

https://download.csdn.net/download/hsy12342611/87346158

猜你喜欢

转载自blog.csdn.net/hsy12342611/article/details/128434977