zoukankan      html  css  js  c++  java
  • C/C++ Qt TabWidget 实现多窗体创建

    在开发窗体应用时通常会伴随分页,TabWidget组件配合自定义Dialog组件,可实现一个复杂的多窗体分页结构,此类结构也是ERP等软件通用的窗体布局方案。

    首先先来实现一个只有TabWidget分页的简单结构,如下窗体布局,布局中空白部分是一个TabWidget组件,下方是一个按钮,当用户点击按钮时,自动将该窗体新增到TabWidget组件中。

    该页面关联代码如下所示,当用户点击on_pushButton_clicked()时自动新增一个窗体并将窗体的Tab设置为指定的IP地址。

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <iostream>
    
    MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        ui->tabWidget->setVisible(false);
        ui->tabWidget->clear();//清除所有页面
        ui->tabWidget->tabsClosable(); //Page有关闭按钮,可被关闭
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    // 定义函数来获取当前Table名字
    QString MainWindow::GetTableNumber()
    {
        QString ref = QString(ui->tabWidget->currentIndex());
        return ref;
    }
    
    // https://www.cnblogs.com/lyshark
    void MainWindow::on_pushButton_clicked()
    {
        FormDoc *ptr = new FormDoc(this);                // 新建选项卡
        ptr->setAttribute(Qt::WA_DeleteOnClose);         // 关闭时自动销毁
    
        int cur = ui->tabWidget->addTab(ptr,QString::asprintf(" 192.168.1.%d",ui->tabWidget->count()));
    
        ui->tabWidget->setTabIcon(cur,QIcon(":/image/1.ico"));
    
        ui->tabWidget->setCurrentIndex(cur);
        ui->tabWidget->setVisible(true);
    }
    
    // 关闭Tab时执行
    void MainWindow::on_tabWidget_tabCloseRequested(int index)
    {
        if (index<0)
            return;
        QWidget* aForm=ui->tabWidget->widget(index);
        aForm->close();
    }
    
    // 在无Tab页面是默认禁用
    void MainWindow::on_tabWidget_currentChanged(int index)
    {
        Q_UNUSED(index);
        bool en=ui->tabWidget->count()>0;
        ui->tabWidget->setVisible(en);
    }
    

    其中的每一个Dialog子窗体,都需要动态获取父窗体指针,当需要操作时则可以根据指针对自身进行操作,子窗体代码如下.

    #include "formdoc.h"
    #include "ui_formdoc.h"
    #include "mainwindow.h"
    
    #include <QVBoxLayout>
    #include <iostream>
    
    FormDoc::FormDoc(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::FormDoc)
    {
        ui->setupUi(this);
    
        QVBoxLayout *Layout = new QVBoxLayout();
        Layout->setContentsMargins(2,2,2,2);
        Layout->setSpacing(2);
        this->setLayout(Layout);
    
        MainWindow *parWind = (MainWindow*)parentWidget(); //获取父窗口指针
        QString ref = parWind->GetTableNumber();           // 获取选中标签索引
        std::cout << ref.toStdString().data() << std::endl;   // By: LyShark
    }
    
    FormDoc::~FormDoc()
    {
        delete ui;
    }
    

    代码运行效果如下:

    Tab组件如果配合ToolBar组件可以实现更多有意思的功能,例如下面这个案例:

    文章出处:https://www.cnblogs.com/LyShark/p/15636674.html
    版权声明:本博客文章与代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章 [均为原创] 作品,转载请 [添加出处] ,您添加出处是我创作的动力!

    如果您恶意转载本人文章并被本人发现,则您的整站文章,将会变为我的原创作品,请相互尊重 !
    转载规范 点击阅读 如果您转载本人文章,则视为您默认同意此规范约定。
  • 相关阅读:
    ASP.NET提供文件下载函数
    web.config access数据库相对路径设置方法 for asp.net2.0
    MSDE安装后身份验证自动是windows验证,osql命令中修改为sqlserve身份验证或混合验证呢及注冊表修改方法
    关于ASP.NET IIS的注册:
    指定datagrid编辑框的宽度及相映属性(转)备用
    TransparentListBox
    在dll中使用FastReport会遇到以下内个问题
    值得学习一
    注册表恢复默认共享
    有关dnn的安装不成功问题
  • 原文地址:https://www.cnblogs.com/LyShark/p/15636674.html
Copyright © 2011-2022 走看看