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

news2025/1/14 18:16:27

1.相关说明

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

相关界面包含关系

2.相关界面

3.相关代码

mainwindow.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

#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

#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

#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

#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

#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();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1492964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EdgeX Foundry - 导出数据到 HTTP 服务

文章目录 一、概述1.安装说明2.HTTP 服务 二、安装部署1.docker-comepse2.修改配置3.启动 EdgeX Foundry4.访问 UI4.1. consul4.2. EdgeX Console 5.测试 EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.org.cn/docs/edgex/device/export-ht…

【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)

@[TOC](【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)) 具体步骤 第一步是注册您的应用程序。特别是,您需要将浏览器指向 http://apps.twitter.com,登录 Twitter(如果您尚未登录)并注册新应用程序。您现在可以为您的应用程序选择名称和描述(例如“Mining Demo”…

C++对象模型剖析(六)一一Data语义学(三)

Data 语义学&#xff08;三&#xff09; “继承” 与 Data member 上期的这个继承的模块我们还剩下一个虚拟继承&#xff08;virtual inheritance&#xff09;没有讲&#xff0c;现在我们就来看看吧。 虚拟继承&#xff08;Virtual Inheritance&#xff09; 虚拟继承本质就是…

Ajax+Axios+前后端分离+YApi+Vue-ElementUI组件+Vue路由+nginx【全详解】

目录 一.Ajax技术 二. Axios 三.前后台分离开发介绍 四. YAPI 五.前端工程化 六.vue工程的目录结构 七.Vue项目核心文件 八.Vue组件库ElementUI AboutView.vue最终代码 AboutView.vue最终代码 九.Vue路由 十.案例 十一.nginx介绍 一.Ajax技术 1.Ajax概述 Ajax: 全…

【粉丝福利】一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读

&#x1f33c;一、前言 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景&#xff0c;在多项专业和学术基准测试中表现出的智力水平&#xff0c;不仅接近甚至有时超越了人类的平均水平。这使得 ChatGPT 在推出之初就受到广大用户的欢迎&#xf…

TRIZ理论破解重量与强度难题:材料科学的革命性突破!

在机械结构设计的领域里&#xff0c;工程师们常常面临着一个难以抉择的问题&#xff1a;如何在保证结构强度的同时&#xff0c;尽可能地减轻重量&#xff1f;传统的惯性思维可能会让我们倾向于增加材料的厚度来增强结构的稳固性&#xff0c;但这样一来&#xff0c;结构的重量也…

电网数字孪生的开发流程

电网的数字孪生是指利用数字化技术和模拟仿真技术&#xff0c;建立起一个与真实电网系统相对应的虚拟仿真系统。它可以帮助电网管理者进行实时监测、预测、优化和管理电网系统&#xff0c;提高电网的运行效率、安全性和可靠性。以下是电网数字孪生的典型开发流程&#xff0c;希…

Unity角色动画变成半跪\半蹲\下沉 的问题

导入的人物动画发生如图形态 解决方法&#xff1a;找到动画模型&#xff0c;Rig - AnimationType 改为Humanoid &#xff0c;然后Apply一下

【电路笔记】-双极晶体管

双极晶体管 文章目录 双极晶体管1、概述2、双极晶体管结构3、双极晶体管配置3.1 共基极 (CB) 配置3.2 共发射极 (CE) 配置3.3 共集极 (CC) 配置4、总结1、概述 双极结型晶体管是一种可用于开关或放大的半导体器件。 与半导体二极管不同,半导体二极管由两片半导体材料组成,形…

rabbitmq3

指定通过通道将消息发送给哪个消息队列 同一个通道可以向不同的队列发送消息的&#xff0c;如果你绑定的队列和发布消息的队列不一致也是可以的&#xff0c;这个才是真正的发布消息去具体的某一个队列&#xff1a; 如果队列没有持久化&#xff0c;就不会把这个消息队列保存在磁…

StarRocks实战——特来电StarRocks应用实践

目录 一、为何引入StarRocks 二、主要应用场景 三、封装或扩展 四、集群监控预警 五、总结规划展望 5.1 使用经验分享 5.2 下一步计划 5.2.1 StarRocks集群自动安装 5.2.2 StarRocks集群高可用架构 原文大佬的这篇StarRocks应用实践有借鉴意义&#xff0c;这里摘抄下来…

智慧城市的未来:利用数字孪生技术推动智慧城市的智能化升级

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、城市规划与建设 2、城市管理与运营 3、公共服务与民生改善 4、应急管理与灾害防控 四、数字孪生技术推动智慧城市的智能化升级的价值 1、提高城市管理的智能化水平 2、优化城市资源配置 …

9.9 指针数组、指针的指针、main函数参数、小结

9.9 指针数组、指针的指针、main函数参数、小结 一.指针数组概念回顾二.指向指针的指针三.指针数组做main函数形参四.小结1.指针数据类型小结表&#xff1a;2.指针运算小结2.1 指针变量的加减2.2 指针变量的赋值2.3 指针变量可以为空值&#xff0c;表示不指向任何变量 3.void *…

OSI 的七层模型

OSI七层模型 一般指开放系统 互连参考模型 (Open System Interconnect 简称OSI) 是国际标准化组 织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系 统提供了一种功能结构的框架。 应用层&#xff1a;各种应用程序协议&#xff0c;比…

Oracle.xs.dll‘ for module DBD::Oracle: load_file:找不到指定的模块

安装Ora2pg时,碰到 异常现象 D:\ProgramFiles\ora2pg>ora2pg -t show_report --estimate_cost -c ora2pg_conf.dist install_driver(Oracle) failed: Cant load D:/ProgramFiles/strawberry/perl/site/lib/auto/DBD/Oracle/Oracle.xs.dll for module DBD::Oracle: load_fil…

FedAsync Asynchronous Federated Optimization

文章目录 IntroductionMethodologyConvergence analysisExperiments Introduction 联邦学习有三个关键属性: 不频繁的任务激活。对于弱边缘设备&#xff0c;学习任务只在设备空闲、充电、连接非计量网络时执行.沟通不频繁。边缘设备和远程服务器之间的连接可能经常不可用、缓…

基于SpringBoot+MYSQL的网页时装购物系统

目录 1、 前言介绍 2、主要技术 3、系统流程分析 3.1、系统登录流程图 3.2、添加信息流程图 3.3、删除信息流程图 4、系统体系结构 4.1、时装购物系统的结构图 4.2、登录系统结构图 4.3、时装购物系统结构图 5、数据库设计原则 5.1、管理员信息属性图 5.2、用户管…

ElevenLabs用AI为Sora文生视频模型配音 ,景联文科技提供高质量真人音频数据集助力生成逼真音效

随着Open AI公司推出的Sora文生视频模型惊艳亮相互联网&#xff0c;AI语音克隆创企ElevenLabs又为Sora的演示视频生成了配音&#xff0c;所有的音效均由AI创造&#xff0c;与视频内容完美融合。 ElevenLabs的语音克隆技术能够从一分钟的音频样本中创建逼真的声音。为了实现这一…

在nginx 服务器部署vue项目

以人人快速开发的开源项目&#xff1a;renren-fast-vue 为例 注&#xff1a;这里开始认为各位都会使用nginx 打包vue项目 npm run build 测试打包的项目是否可以运行 serve dist 可以正常运行 编译报错请移步到&#xff1a;renren-fast-vue1.2.2 项目编译报错: build g…

SpringCloud微服务-DockerCompose(初识、安装、部署)

DockerCompose&#xff08;初识、安装、部署&#xff09; 文章目录 DockerCompose&#xff08;初识、安装、部署&#xff09;初识DockerCompose&#xff1f;DockerCompose安装DockerCompose部署微服务问题解决&#xff08;重要&#xff01;&#xff01;&#xff01;&#xff09…