Qt多弹窗实现包括QDialog、QWidget、QMainWindow

1.相关说明

独立Widget窗口、嵌入式Widget、嵌入式MainWindow窗口、独立MainWindow窗口等弹窗的实现

相关界面包含关系

2.相关界面

3.相关代码

mainwindow.cpp

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "tformdoc.h"
#include "tformtable.h"

#include <QPainter>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // setCentralWidget(ui->tabWidget);
    ui->tabWidget->setVisible(false);
    ui->tabWidget->clear();
    ui->tabWidget->setTabsClosable(true);

}

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

void MainWindow::do_changeTabTitle(QString title)
{
    int index = ui->tabWidget->currentIndex();
    ui->tabWidget->setTabText(index, title);
}

void MainWindow::on_actionWidgetInsite_triggered()
{
    TFormDoc *formDoc = new TFormDoc(this);
    formDoc->setAttribute(Qt::WA_DeleteOnClose);
    int cur = ui->tabWidget->addTab(formDoc, QString::asprintf("Doc %d", ui->tabWidget->count()));
    ui->tabWidget->setCurrentIndex(cur);
    ui->tabWidget->setVisible(true);

    connect(formDoc, &TFormDoc::titleChanged, this, &MainWindow::do_changeTabTitle);
}
// tab的关闭
void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
    ui->tabWidget->widget(index)->close();
}

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawPixmap(0, ui->toolBar->height(),
                       width(), height()-ui->toolBar->height()-ui->statusbar->height(),
                       QPixmap(":/jpg/jpg/shenli.jpg"));
}

// 独立Widget窗口
void MainWindow::on_actionWidgetAlone_triggered()
{
    TFormDoc *formDoc = new TFormDoc();
    formDoc->setAttribute(Qt::WA_DeleteOnClose);
    formDoc->setWindowTitle("基于QWidget的窗口");
    formDoc->setWindowOpacity(0.8);
    formDoc->show();
}

// 嵌入式MainWindow窗口
void MainWindow::on_actionMainWindowInsite_triggered()
{
    TFormTable *formTable = new TFormTable(this);
    formTable->setAttribute(Qt::WA_DeleteOnClose);
    int cur = ui->tabWidget->addTab(formTable, QString::asprintf("Table %d", ui->tabWidget->count()));
    ui->tabWidget->setCurrentIndex(cur);
    ui->tabWidget->setVisible(true);
}
// 独立式MainWindow窗口
void MainWindow::on_actionMainWindowAlone_triggered()
{
    TFormTable *formTable = new TFormTable();
    formTable->setAttribute(Qt::WA_DeleteOnClose);
    formTable->setWindowTitle("独立的window");
    formTable->show();
}

tformdoc.cpp

cpp 复制代码
#include "tformdoc.h"
#include "ui_tformdoc.h"
#include <QToolBar>
#include <QFileDialog>
#include <QFontDialog>
#include <QVBoxLayout>
TFormDoc::TFormDoc(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::TFormDoc)
{
    ui->setupUi(this);
    QToolBar *locToolBar = new QToolBar("文档", this);
    locToolBar->addAction(ui->actionOpenFile);
    locToolBar->addAction(ui->actionFont);
    locToolBar->addSeparator();
    locToolBar->addAction(ui->actionCut);
    locToolBar->addAction(ui->actionCopy);
    locToolBar->addAction(ui->actionPatse);
    locToolBar->addAction(ui->actionRedo);
    locToolBar->addAction(ui->actionUndo);
    locToolBar->addSeparator();
    locToolBar->addAction(ui->actionClose);
    locToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(locToolBar);
    layout->addWidget(ui->plainTextEdit);
    this->setLayout(layout);
}

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

void TFormDoc::on_actionOpenFile_triggered()
{
    QString curPath = QCoreApplication::applicationDirPath();
    QString aFileName = QFileDialog::getOpenFileName(this, "打开一个文件", curPath, "(*.h *.cpp);;(*.txt);;(*.*)");
    if(aFileName.isEmpty()){
        return;
    }
    QFile aFile(aFileName);
    if(aFile.open(QIODevice::ReadOnly | QIODevice::Text)){
        ui->plainTextEdit->clear();
        QTextStream aStream(&aFile);
        while(!aStream.atEnd()){
            QString str = aStream.readLine();
            ui->plainTextEdit->appendPlainText(str);
        }
        aFile.close();
        QFileInfo fileInfo(aFileName);
        QString shortName = fileInfo.fileName();
        setWindowTitle(shortName);
        emit titleChanged(shortName);
    }

}

void TFormDoc::on_actionFont_triggered()
{
    QFont font = ui->plainTextEdit->font();
    bool ok;
    font = QFontDialog::getFont(&ok, font);
    if(ok){
        ui->plainTextEdit->setFont(font);
    }
}


void TFormDoc::on_actionClose_triggered()
{
    this->close();
}

tformtable.cpp

cpp 复制代码
#include "tformtable.h"
#include "ui_TFormTable.h"
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include <QMessageBox>
#include <QLabel>
#include "tdialogsize.h"
#include "tdialogheaders.h"
#include "tdialoglocate.h"

TFormTable::TFormTable(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::TFormTable)
{
    ui->setupUi(this);
    dlgHeaders = NULL; // 初始化
    m_model = new QStandardItemModel(4, 4, this);
    QStringList header;
    header << "姓名" << "性别" << "学位" << "部门";
    m_model->setHorizontalHeaderLabels(header);
    m_selection = new QItemSelectionModel(m_model);
    ui->tableView->setModel(m_model);
    ui->tableView->setSelectionModel(m_selection);

    setCentralWidget(ui->tableView);
    labCellPos = new QLabel("当前单元:", this);
    labCellPos->setMinimumWidth(200);
    labCellText = new QLabel("单元格内容:", this);
    labCellText->setMinimumWidth(200);
    ui->statusbar->addWidget(labCellPos);
    ui->statusbar->addWidget(labCellText);
    connect(m_selection, &QItemSelectionModel::currentChanged, this, &TFormTable::do_model_currentChanged);
}

TFormTable::~TFormTable()
{
    delete ui;

}

// void TFormTable::on_actionSetRowCol_triggered()
// {
//     TDialogSize *dlgTableSize = new TDialogSize();
//     dlgTableSize->setWindowFlag(Qt::MSWindowsFixedSizeDialogHint);
//     dlgTableSize->setRowColumn(m_model->rowCount(), m_model->columnCount());
//     int ret = dlgTableSize->exec();
//     if(ret == QDialog::Accepted){
//         m_model->setColumnCount(dlgTableSize->columnCount());
//         m_model->setRowCount(dlgTableSize->rowCount());
//     }
//     delete dlgTableSize;
// }

void TFormTable::on_actionSetRowCol_triggered()
{
    TDialogSize dlgTableSize;
    dlgTableSize.setWindowFlag(Qt::MSWindowsFixedSizeDialogHint);
    dlgTableSize.setRowColumn(m_model->rowCount(), m_model->columnCount());
    int ret = dlgTableSize.exec();
    if(ret == QDialog::Accepted){
        m_model->setColumnCount(dlgTableSize.columnCount());
        m_model->setRowCount(dlgTableSize.rowCount());
    }
    // delete dlgTableSize;
}

void TFormTable::on_actionSetHeader_triggered()
{
    if(dlgHeaders == NULL){
        dlgHeaders = new TDialogHeaders(this);
    }
    QStringList strList;
    for(int i = 0; i < m_model->columnCount(); i++){
        strList.append(m_model->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString());
    }
    dlgHeaders->setHeaderList(strList);
    int ret = dlgHeaders->exec();
    if(ret == QDialog::Accepted){
        m_model->setHorizontalHeaderLabels(dlgHeaders->headerList());
    }
}

void TFormTable::do_setCellText(int row, int column, QString text)
{
    QModelIndex index = m_model->index(row, column);
    m_selection->clearSelection();
    m_selection->setCurrentIndex(index, QItemSelectionModel::Select);
    m_model->setData(index, text, Qt::DisplayRole);
}


void TFormTable::on_actionLocateUnit_triggered()
{
    TDialogLocate *dlgLocate = new TDialogLocate(this);
    dlgLocate->setAttribute(Qt::WA_DeleteOnClose);
    dlgLocate->setWindowFlag(Qt::WindowStaysOnTopHint);
    // 初始化对话框
    dlgLocate->setSpinRange(m_model->rowCount(), m_model->columnCount());
    QModelIndex curIndex = m_selection->currentIndex();
    if(curIndex.isValid()){
        dlgLocate->setSpinValue(curIndex.row(), curIndex.column());
    }
    dlgLocate->show();
    dlgLocate->setModal(false);
    connect(dlgLocate, &TDialogLocate::changeCellText, this, &TFormTable::do_setCellText);
    connect(dlgLocate, &TDialogLocate::changeActionEnable, ui->actionLocateUnit, &QAction::setEnabled);
    connect(this, &TFormTable::cellIndexChanged, dlgLocate, &TDialogLocate::setSpinValue);

}


void TFormTable::on_tableView_clicked(const QModelIndex &index)
{
    emit cellIndexChanged(index.row(), index.column());
}

void TFormTable::do_model_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 = m_model->itemFromIndex(current);
        labCellText->setText("单元格内容:" + aItem->text());
    }
}

tdialogheaders.cpp

cpp 复制代码
#include "tdialogheaders.h"
#include "ui_tdialogheaders.h"
#include <QStringListModel>

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

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

void TDialogHeaders::setHeaderList(QStringList &headers)
{
    m_model->setStringList(headers);
}

QStringList TDialogHeaders::headerList()
{
    return m_model->stringList();
}

tdialoglocate.cpp

cpp 复制代码
#include "tdialoglocate.h"
#include "ui_tdialoglocate.h"
#include <QCloseEvent>
#include <QShowEvent>

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

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

void TDialogLocate::setSpinRange(int rowCount, int colCount)
{
    ui->spinBoxRow->setMaximum(rowCount-1);
    ui->spinBoxCol->setMaximum(colCount-1);
}

void TDialogLocate::setSpinValue(int rowNo, int colNo)
{
    ui->spinBoxRow->setValue(rowNo);
    ui->spinBoxCol->setValue(colNo);
}

// 设定文字
void TDialogLocate::on_btnSetText_clicked()
{
    QString text = ui->lineEdit->text();
    int row = ui->spinBoxRow->value();
    int col = ui->spinBoxCol->value();
    if(ui->chkIncRow->isChecked()){
        ui->spinBoxRow->setValue(ui->spinBoxRow->value()+1);
    }
    if(ui->chkIncCol->isChecked()){
        ui->spinBoxCol->setValue(ui->spinBoxCol->value()+1);
    }
    emit changeCellText(row, col, text);
}

void TDialogLocate::closeEvent(QCloseEvent *event)
{
    event->accept();
    emit changeActionEnable(true);
}

void TDialogLocate::showEvent(QShowEvent *event)
{
    event->accept();
    emit changeActionEnable(false);
}

tdialogsize.cpp

cpp 复制代码
#include "tdialogsize.h"
#include "ui_tdialogsize.h"
#include <QMessageBox>

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

TDialogSize::~TDialogSize()
{
    delete ui;
    QMessageBox::information(this, "提示", "TDialogSize释放资源");
}

void TDialogSize::setRowColumn(int row, int column)
{
    ui->spinBoxRow->setValue(row);
    ui->spinBoxCol->setValue(column);
}

int TDialogSize::rowCount()
{
    return ui->spinBoxRow->value();
}

int TDialogSize::columnCount()
{
    return ui->spinBoxCol->value();
}
相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner13 天前
DicomViewer (目录调整) 2
qt
xcyxiner13 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript