精华内容
下载资源
问答
  • PyQt5 自定义QTableWidget
    2021-02-26 16:52:59

    添加功能

    1、设置单元格文本居中
    2、添加自定义按钮
    3、设置指定行、列不可编辑

    代码展示

    from PyQt5 import QtWidgets, QtCore
    from PyQt5.QtCore import pyqtSignal, Qt
    from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem, QItemDelegate
    
    from switchbtn import SwitchBtn
    
    
    class MyTableWidget(QTableWidget):
        switch_sig = pyqtSignal(list)
    
        def __init__(self, parent=None):
            super().__init__(parent)
    
        # 单元格文本居中(行,列,内容)
        def con_center(self, row, col, item_str):
            newItem = QTableWidgetItem(item_str)
            newItem.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.setItem(row, col, newItem)
    
        # 添加状态按钮
        def add_switchbtn(self, row, col):
            check_btn = SwitchBtn()
            check_btn.checkedChanged.connect(self.checkChanged)
            self.setCellWidget(row, col, check_btn)
    
        # 发送状态按钮信号
        def checkChanged(self):
            check_box = self.sender()
            ix = self.indexAt(check_box.pos())
            row, col, is_checked = ix.row(), ix.column(), check_box.checked
            self.switch_sig.emit([row, col, is_checked])
    
        # 设置列不可编辑
        def col_enabled(self, col):
            self.setItemDelegateForColumn(col, EmptyDelegate(self))
    
        # 设置行不可编辑
        def row_enabled(self, row):
            self.setItemDelegateForRow(row, EmptyDelegate(self))
    
    
    class EmptyDelegate(QItemDelegate):
        def __init__(self, parent):
            super().__init__(parent)
    
        def createEditor(self, QWidget, QStyleOptionViewItem, QModelIndex):
            return None
    
    

    switchbtn.py

    链接:switchbtn.py

    from switchbtn import SwitchBtn # 点击跳转链接查看switchbtn.py
    
    更多相关内容
  • QT自定义QTableWidget

    千次阅读 2020-06-23 12:05:08
    目录QT自定义QTableWidget1.实现效果2.具体实现:(1)表格QTabelWidget(2)表头QHeaderView QT自定义QTableWidget 1.实现效果 2.具体实现: (1)表格QTabelWidget QTabelWidget *table=new QTableWidget(11,6); //...

    QT自定义QTableWidget


    1.实现效果

    表格效果

    2.具体实现:

    (1)表格QTabelWidget

    	QTabelWidget *table=new QTableWidget(11,6);	//设置行列个数
        table->setShowGrid(false);		//是否显示内部网格线条
        table->setFixedSize(1782,698);		//设置表格固定大小
        table->setAlternatingRowColors(1);	//是否显示交替颜色
        table->setEditTriggers(QAbstractItemView::NoEditTriggers);		//是否可编辑
        table->setSelectionMode(QAbstractItemView::NoSelection);	//是否可选中
        table->setProperty("table_31",true);		//设置分类
        for(int i=0; i<11; i++ ){				//设置行高,列宽
            table->setRowHeight(i,58);
        }
    	for(int i=0; i<6; i++ ){
    		table->setColumnWidth(i,200);
    	}
    
    • qss样式表
    QTableWidget[table_31="true"]{
        border: 1px solid  #8B8B8B;		/*表格外边框*/
    	padding: 0px;		/*内边距*/
    	margin: 0px;			/*外边距*/
    	color: #575757;		/*表格文本的颜色*/
    	background: white;	/*表格背景色*/
    	alternate-background-color: lightgray;		/*表格交替色*/
    	gridline-color:	#8B8B8B;		/*网格边框*/
    	font-size: 24px;					/*表格文本大小*/
    	border-radius: 20px;		/*表格边框弧度*/
    	font-family: "Microsoft YaHei";		/*表格文本字体*/
    }
    
    QTableWidget::item[table_31="true"]{
        border-radius: 0px;				/*item 弧度*/
    	background: transparent;	/*item 背景色*/
    	border-style: none;			/*去除边框*/
        border-bottom: 1px solid  #8B8B8B;		/*底 边框*/
    	border-right: 1px solid  red;		/*右 边框*/
    	border-left: 1px solid  red;			/*左 边框*/
    	border-top: 1px solid  #8B8B8B;		/*顶 边框*/
    }
    /*item 选中时*/
    QTableWidget::item:selected[table_31="true"]{
        background:	transparent;
    	color: black;
    }
    /*item 悬停*/
    QTableWidget::item:hover[table_31="true"]{
        background:	transparent;
    	color: black;
    }
    /*垂直表头和水平表头相交的单元格*/
    QTableWidget[table_31="true"] QTableCornerButton::section{
       background: white;
       border: 1px solid  #8B8B8B;
    }
    

    (2)表头QHeaderView

    	//水平表头
        table->horizontalHeader()->setVisible(true);		//设置表头是否可见
        table->horizontalHeader()->setStretchLastSection(true);	//自动调整对齐右边边界
        table->horizontalHeader()->setDefaultAlignment(Qt::AlignHCenter | Qt::AlignVCenter);		//表头文本对齐方式
        table->horizontalHeader()->setObjectName("hHeader");		//表头对象名
        //垂直表头
        table->verticalHeader()->setVisible(false);
        table->verticalHeader()->setStretchLastSection(true);		//自动调整对齐底部边界
        table->verticalHeader()->setDefaultAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
        table->verticalHeader()->setObjectName("vHeader");
        //设置表头文本
    	QStringList header;
        header<<"A"<<"B"<<"C"<<"D"<<"E"<<"F";
        table->setHorizontalHeaderLabels(header);
        header.clear();
    	header<<"A"<<"B"<<"C"<<"D"<<"E"<<"F"<<"G"<<"H"<<"I"<<"J"<<"K";
    	table->setVerticalHeaderLabels(header);
    
    • qss样式表
    /*水平表头*/
    QHeaderView#hHeader{
    	min-height: 50px;		/*表头最小高度*/
    	background-color: transparent;
    	border-top-left-radius: 10px;
    	border-top-right-radius: 10px;
     	border-bottom-left-radius: 0px;
    	border-bottom-right-radius: 0px;
    }
    /*表头section*/
    QHeaderView::section#hHeader{
       	background-color: transparent;		
       	border: 1px solid  #8B8B8B;
       	border-radius: 0px;
       	font-size: 24px;
       	color:  #1B1B1B;
       /*border-style:none;*/
    	border-bottom: 1px solid  #8B8B8B;
    	border-right: 1px solid blue;
    	border-left: 1px solid blue;
    	border-top: 1px solid blue;
    }
    /*垂直表头*/
    QHeaderView#vHeader{
       min-width: 50px;
       background: white;
    }
    QHeaderView::section#vHeader{
       background-color: white;
       border: 1px solid  #8B8B8B;
       border-radius: 0px;
       border-left-color: white;
       font-size: 24px;
       font-family: "Microsoft YaHei";
    }
    

    (3)插入数据

        for(int i=0; i<11; i++){
            for(int j=0; j<6; j++){
                QTableWidgetItem *tab_item=new QTableWidgetItem("Jan");
                tab_item->setTextAlignment(Qt::AlignCenter);
                table->setItem(i,j,tab_item);			//文本
                //table->setItem(0,1,new QTableWidgetItem(QIcon(":/Image/IED.png"), "Jan's month"));		//图片
                //table->setCellWidget(0,0,new QLabel("Love"));		//label
            }
        }
    
    展开全文
  • 自定义QTableWidget实现分页

    千次阅读 2020-09-21 17:48:03
    然后用代码定义一个PageTable类,将分页组件与QTableWidget封装进去 使用封装好的PageTable 核心代码如下: 自定义Page组件 类 #include "PageWidget.h" #include "ui_PageWidget.h" #include <QtGlobal>...

    QT自带没有分页组件,加载表格大数据的时候有些不方便,因此打算全部用源码自定义一个表格+分页,这样方便以后移植。

    具体思路如下:

    1.   先实现一个分页组件
    2.  然后用代码定义一个PageTable类,将分页组件与QTableWidget封装进去
    3. 使用封装好的PageTable

    完整源码 

    核心代码如下:

    • 自定义Page组件 类
    #include "PageWidget.h"
    #include "ui_PageWidget.h"
    
    #include <QtGlobal>
    #include <QHBoxLayout>
    #include <QMouseEvent>
    #include <QKeyEvent>
    #include <QDebug>
    
    PageWidget::PageWidget(int blockSize, QWidget *parent) : QWidget(parent),
        ui(new Ui::PageWidget) {
        ui->setupUi(this);
        setBlockSize(blockSize);
        initialize();
    
        maxPage = 0;
        setMaxPage(1);
    }
    
    PageWidget::~PageWidget() {
        delete ui;
        delete pageLabels;
    }
    
    bool PageWidget::eventFilter(QObject *watched, QEvent *e) {
        if (e->type() == QEvent::MouseButtonRelease) {
            int page = -1;
            if (watched == ui->previousPageLabel) { page = getCurrentPage() - 1; }
    
            if (watched == ui->nextPageLabel) { page = getCurrentPage() + 1; }
    
            for (int i = 0; i < pageLabels->count(); ++i) {
                if (watched == pageLabels->at(i)) {
                    page = pageLabels->at(i)->text().toInt();
                    break;
                }
            }
    
            if (-1 != page) {
                setCurrentPage(page, true);
                return true;
            }
        }
    
        if (watched == ui->pageLineEdit && e->type() == QEvent::KeyRelease) {
            QKeyEvent *ke = static_cast<QKeyEvent *>(e);
            if (ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Return) {
                setCurrentPage(ui->pageLineEdit->text().toInt(), true);
                //setMaxPage(ui->pageLineEdit->text().toInt()); // 测试生成多个页码
                return true;
            }
        }
    
        return QWidget::eventFilter(watched, e);
    }
    
    int PageWidget::getBlockSize() const {
        return blockSize;
    }
    
    int PageWidget::getMaxPage() const {
        return maxPage;
    }
    
    int PageWidget::getCurrentPage() const {
        return currentPage;
    }
    
    void PageWidget::setMaxPage(int page) {
        page = qMax(page, 1);
    
        if (maxPage != page) {
            this->maxPage = page;
            this->currentPage = 1;
            updatePageLabels();
        }
    }
    
    void PageWidget::setCurrentPage(int page, bool signalEmitted) {
        page = qMax(page, 1);
        page = qMin(page, maxPage);
    
        if (page != this->currentPage) {
            this->currentPage = page;
            updatePageLabels();
    
            if (signalEmitted) {
                emit currentPageChanged(page);
            }
        }
    }
    
    void PageWidget::setBlockSize(int blockSize) {
        // 为了便于计算, block size 必须是奇数, 且最小为3
        blockSize = qMax(blockSize, 3);
        if (blockSize % 2 == 0) {
            ++blockSize;
        }
        this->blockSize = blockSize;
    }
    
    // 初始化页码的labels
    // 分成三个部分, 左...中...右
    void PageWidget::initialize() {
        ui->pageLineEdit->installEventFilter(this);
        ui->pageLineEdit->setValidator(new QIntValidator(1, 10000000, this));
    
        ui->nextPageLabel->setProperty("page", "true");
        ui->previousPageLabel->setProperty("page", "true");
        ui->nextPageLabel->installEventFilter(this);
        ui->previousPageLabel->installEventFilter(this);
    
        pageLabels = new QList<QLabel *>();
    
        QHBoxLayout *leftLayout = new QHBoxLayout();
        QHBoxLayout *centerLayout = new QHBoxLayout();
        QHBoxLayout *rightLayout = new QHBoxLayout();
        leftLayout->setContentsMargins(0, 0, 0, 0);
        leftLayout->setSpacing(0);
        centerLayout->setContentsMargins(0, 0, 0, 0);
        centerLayout->setSpacing(0);
        rightLayout->setContentsMargins(0, 0, 0, 0);
        rightLayout->setSpacing(0);
    
        for (int i = 0; i < blockSize * 3; ++i) {
            QLabel *label = new QLabel(QString::number(i + 1));
            label->setProperty("page", "true");
            label->installEventFilter(this);
    
            pageLabels->append(label);
    
            if (i < blockSize) {
                leftLayout->addWidget(label);
            } else if (i < blockSize * 2) {
                centerLayout->addWidget(label);
            } else {
                rightLayout->addWidget(label);
            }
        }
    
        ui->leftPagesWidget->setLayout(leftLayout);
        ui->centerPagesWidget->setLayout(centerLayout);
        ui->rightPagesWidget->setLayout(rightLayout);
    }
    
    void PageWidget::updatePageLabels() {
        ui->leftSeparateLabel->hide();
        ui->rightSeparateLabel->hide();
    
        if (maxPage <= blockSize * 3) {
            for (int i = 0; i < pageLabels->count(); i += 1) {
                QLabel *label = pageLabels->at(i);
    
                if (i < maxPage) {
                    label->setText(QString::number(i + 1));
                    label->show();
                } else {
                    label->hide();
                }
    
                if (currentPage - 1 == i) {
                    label->setProperty("currentPage", "true");
                } else {
                    label->setProperty("currentPage", "false");
                }
    
                label->setStyleSheet("/**/");
            }
            return;
        }
    
        // 以下情况为maxPageNumber大于blockSize * 3, 所有的页码label都要显示
        // c 为 currentPage
        // n 为 block size
        // m 为 maxPage
    
        // 1. c ∈ [1, n + n/2 + 1]: 显示前 n * 2 个, 后 n 个: 只显示右边的分隔符
        // 2. c ∈ [m - n - n/2, m]: 显示前 n 个, 后 n * 2 个: 只显示左边的分隔符
        // 3. 显示[1, n], [c - n/2, c + n/2], [m - 2*n + 1, m]: 两个分隔符都显示
    
        int c = currentPage;
        int n = blockSize;
        int m = maxPage;
        int centerStartPage = 0;
    
        if (c >= 1 && c <= n + n / 2 + 1) {
            // 1. c ∈ [1, n + n/2 + 1]: 显示前 n * 2 个, 后 n 个: 只显示右边的分隔符
            centerStartPage = n + 1;
            ui->rightSeparateLabel->show();
        } else if (c >= m - n - n / 2 && c <= m) {
            // 2. c ∈ [m - n - n/2, m]: 显示前 n 个, 后 n * 2 个: 只显示左边的分隔符
            centerStartPage = m - n - n + 1;
            ui->leftSeparateLabel->show();
        } else {
            // 3. 显示[1, n], [c - n/2, c + n/2], [m - n + 1, m]: 两个分隔符都显示
            centerStartPage = c - n / 2;
            ui->rightSeparateLabel->show();
            ui->leftSeparateLabel->show();
        }
    
        for (int i = 0; i < n; ++i) {
            pageLabels->at(i)->setText(QString::number(i + 1));                     // 前面 n 个
            pageLabels->at(n + i)->setText(QString::number(centerStartPage + i));   // 中间 n 个
            pageLabels->at(3 * n - i - 1)->setText(QString::number(m - i));         // 后面 n 个
        }
    
        for (int i = 0; i < pageLabels->count(); ++i) {
            QLabel *label = pageLabels->at(i);
            int page = label->text().toInt();
            if (page == currentPage) {
                label->setProperty("currentPage", "true");
            } else {
                label->setProperty("currentPage", "false");
            }
    
            label->setStyleSheet("/**/");
            label->show();
        }
    }
    
    •  封装后的PageTable类
    #include "PageTable.h"
    #include <QTableWidget>
    #include <QDebug>
    #include <QHeaderView>
    
    
    PageTable::PageTable(QStringList &header,int rowCount)
    {
    
    
        qDebug()<<" PageTable init ,rowCount:"<<rowCount << ",header size:"<<header.size();
    
        tableWidget = new QTableWidget(rowCount,header.size());//构造一个10行5列的表格
        tableWidget->setWindowTitle("Title");
        tableWidget->setHorizontalHeaderLabels(header);
        tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);//设置表格为单行选择
        tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//设置只能选中行,不能单个选择单元格
        tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置单元格不可编辑
        tableWidget->verticalHeader()->setHidden(true);// 隐藏行号 (不显示前面行号)
        tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//让表格挤满占个父容器
    //    for(int i = 1;i<header.size();i++)
    //        tableWidget->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Interactive);   //然后设置要根据内容使用宽度的列(其他没设置的列自动缩放)
    
    
    //    for(int i = 0;i<rowCount;i++){
    //        tableWidget->setItem(i,0, new QTableWidgetItem("context"));
    //        tableWidget->item(i,0)->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter);
    //        tableWidget->setRowHeight(i,25);
    //    }
    
        //设置表头样式
        tableWidget->setStyleSheet("QHeaderView::section {"
                                   "color: black;font:bold 14px \"微软雅黑\";"
                                   "text-align:center;"
                                   "height:25px;"
                                   "background-color: #d1dff0;"
                                   " border:1px solid #8faac9;"
                                   "border-left:none;"
                                   "}");
    
        QHBoxLayout *hLayout = new QHBoxLayout();//让PageWidget水平居中
        pageWidget = new PageWidget();
        //pageWidget->setMaxPage(20);
        hLayout->addWidget(pageWidget);
    
        // 分页组件的css,这个内容应该放到普通文件中然后加载
        QString qss = QString(".QLabel[page=\"true\"] { padding: 1px; }")
                + QString(".QLabel[currentPage=\"true\"] { color: rgb(190, 0, 0);}")
                + QString(".QLabel[page=\"true\"]:hover { color: white; border-radius: 4px; background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(53, 121, 238, 255), stop:1 rgba(0, 202, 237, 255));}");
        pageWidget->setStyleSheet(qss);
    
    
        this->addWidget(tableWidget);
        this->addLayout(hLayout);
    
        tableWidget->horizontalHeader()->size();//列
    
    }
    
    void PageTable::SetData(QList<QList<QString>> &DataList)
    {
       for(int i = 0;i<DataList.size();i++){
    
            QList<QString> Item = DataList[i];
            for(int j = 0;j<Item.size();j++){
                this->tableWidget->setItem(i,j, new QTableWidgetItem(Item[j]));
            }
       }
    }
    
    
    
    PageTable::~PageTable()
    {
        qDebug() << "~PageTable() invoke..." ;
    }
    
    •   使用
      #include "mainwindow.h"
      #include "ui_mainwindow.h"
      #include <QVBoxLayout>
      #include <QHBoxLayout>
      #include <QTableWidget>
      #include <QDebug>
      #include "pageWidget/PageTable.h"
      
      
      
      
      MainWindow::MainWindow(QWidget *parent) :
          QMainWindow(parent),
          ui(new Ui::MainWindow)
      {
          ui->setupUi(this);
      
          qDebug() << "[Debug] MyObject::test ";
      
          QStringList header;
          header<<"T1"<<"T2"<<"T3"<<"T4"<<"T5"<<"T6"<<"T7";
          pageTable = new PageTable(header,5);
          ui->testLayout->addLayout(pageTable);
      
          connect(pageTable->pageWidget, SIGNAL(currentPageChanged(int)), this, SLOT(PageChange(int)));
      
      }
      
      QList<QList<QString>> DataList;//数据
      int RowIndex = 0;
      
      void MainWindow::LoadPage(int pageIndex){
      
          DataList.clear();//先清空,只缓存一页。如果有100万条,缓存到List不合适
      
          for(int i = 0;i< 10;i++){//10行
              QList<QString> Row;
              RowIndex += 1;
              Row.append(QString("Data_1_%1_%2").arg(RowIndex).arg(pageIndex));
              Row.append(QString("Data_2_%1_%2").arg(RowIndex).arg(pageIndex));
              Row.append(QString("Data_3_%1_%2").arg(RowIndex).arg(pageIndex));
              Row.append(QString("Data_4_%1_%2").arg(RowIndex).arg(pageIndex));
              Row.append(QString("Data_5_%1_%2").arg(RowIndex).arg(pageIndex));
              Row.append(QString("Data_6_%1_%2").arg(RowIndex).arg(pageIndex));
              Row.append(QString("Data_7_%1_%2").arg(RowIndex).arg(pageIndex));
              DataList.append(Row);
          }
          pageTable->SetData(DataList);
      }
      
      void MainWindow::BtnLoadDataClick(){
      
          qDebug() << "click ...."<<RowIndex;
          pageTable->pageWidget->setMaxPage(10);//假如有10页数据
          pageTable->pageWidget->setCurrentPage(1);
          RowIndex = 0;
          LoadPage(1);//加载第一页
      
      
      }
      
      
      void MainWindow::PageChange(int currentPage){
      
          qDebug()<<"pageChagne"<<currentPage;
          this->LoadPage(currentPage);
      }
      
      
      
      
      MainWindow::~MainWindow()
      {
          delete ui;
      }
      

      效果如下:

       

    展开全文
  • QTableWidget> #include "widget.h" #include <QTableWidgetItem> class MyTable : public QTableWidget { public: MyTable(QWidget *parent = nullptr); ~MyTable(); void SetType(PageId

    提升类要管理多种表格的数据,也可以考虑QList中存储数据对象的基类指针,用法QList存储多种数据类型,省去了每一种表格都要新加一个QList对象保存
    mytable.h

    #ifndef MYTABLE_H
    #define MYTABLE_H
    
    #include <QTableWidget>
    #include "widget.h"
    #include <QTableWidgetItem>
    class MyTable : public QTableWidget
    {
    public:
        MyTable(QWidget *parent = nullptr);
        ~MyTable();
        void SetType(PageId::Type type);
        void initTable();
        void SetTablePage1();
        void SetTablePage2();
        void SetTablePage3();
        void SetTableInfo1(QString str);
        void SetTableInfo2(QString str);
        void SetTableInfo3(QString str);
        void ShowTableInfo1();
        void ShowTableInfo2();
        void ShowTableInfo3();
        void ClearTableInfo();
    private:
        void OnItemChange(QTableWidgetItem *item);
    private:
        PageId::Type m_type;
        QList<tableInfo> m_table1;
        QList<tableInfo> m_table2;
        QMap<PageId::Type,QList<tableInfo>> m_tableMap;
    };
    
    #endif // MYTABLE_H
    
    

    mytable.cpp

    #include "mytable.h"
    #include <QDebug>
    #include <QHeaderView>
    #include <iostream>
    using namespace std;
    MyTable::MyTable(QWidget *parent):QTableWidget(parent),m_type(PageId::En_Type1)
    {
        initTable();
        connect(this,&MyTable::itemChanged,this,&MyTable::OnItemChange);
        tableInfo info;
        for(int i=0; i<5; i++){
            m_table1.push_back(info);
            m_table2.push_back(info);
        }
    }
    
    MyTable::~MyTable()
    {
    
    }
    
    void MyTable::SetType(PageId::Type type)
    {
        m_type = type;
    }
    
    void MyTable::initTable()
    {
        switch (m_type) {
        case PageId::En_Type1:
            ClearTableInfo();
            SetTablePage1();
            ShowTableInfo1();
            break;
        case PageId::En_Type2:
            ClearTableInfo();
            SetTablePage2();
            ShowTableInfo2();
            break;
        case PageId::En_Type3:
            break;
        default:{}
        }
    }
    
    void MyTable::SetTablePage1()
    {
        QStringList strs;
        strs << "one" << "two" << "three" << "four" << "five";
        setColumnCount(5);
        setHorizontalHeaderLabels(strs);
        setRowCount(5);
    }
    
    void MyTable::SetTablePage2()
    {
        QStringList strs;
        strs << "1" << "2" << "3" << "4" << "5";
        setColumnCount(5);
        setHorizontalHeaderLabels(strs);
    }
    
    void MyTable::SetTablePage3()
    {
    
    }
    
    void MyTable::SetTableInfo1(QString str)
    {
        int row = currentIndex().row();
        int column = currentIndex().column();
        qDebug() << row << ":" << column;
        switch(column)
        {
        case 0:
            m_table1[row].one = str;
            break;
        case 1:
            m_table1[row].two = str;
            break;
        case 2:
            m_table1[row].three = str;
            break;
        case 3:
            m_table1[row].four = str;
            break;
        case 4:
            m_table1[row].five = str;
            break;
        default:{}
        }
        m_tableMap[m_type] = m_table1;
    }
    
    void MyTable::SetTableInfo2(QString str)
    {
        int row = currentIndex().row();
        int column = currentIndex().column();
        //qDebug() << row << ":" << column;
        switch(column)
        {
        case 0:
            m_table2[row].one = str;
            break;
        case 1:
            m_table2[row].two = str;
            break;
        case 2:
            m_table2[row].three = str;
            break;
        case 3:
            m_table2[row].four = str;
            break;
        case 4:
            m_table2[row].five = str;
            break;
        default:{}
        }
        m_tableMap[m_type] = m_table2;
    }
    
    void MyTable::SetTableInfo3(QString str)
    {
    
    }
    
    
    void MyTable::ShowTableInfo1()
    {
        QList<tableInfo> list = m_tableMap[m_type];
    
        for (int i=0; i<list.count(); i++) {
                 setItem(i,0,new QTableWidgetItem(list[i].one));
                 setItem(i,1,new QTableWidgetItem(list[i].two));
                 setItem(i,2,new QTableWidgetItem(list[i].three));
                 setItem(i,3,new QTableWidgetItem(list[i].four));
                 setItem(i,4,new QTableWidgetItem(list[i].five));
    
                 //item(i,1)->setData(Qt::DisplayRole,list[i].two);//需要先申请item元素资源,否则item为空
                 //item(i,2)->setData(Qt::DisplayRole,list[i].three);
                 //item(i,3)->setData(Qt::DisplayRole,list[i].four);
                 //item(i,4)->setData(Qt::DisplayRole,list[i].five);
        }
    }
    
    void MyTable::ShowTableInfo2()
    {
        QList<tableInfo> list = m_tableMap[m_type];
    
        for (int i=0; i<list.count(); i++) {
            setItem(i,0,new QTableWidgetItem(list[i].one));
            setItem(i,1,new QTableWidgetItem(list[i].two));
            setItem(i,2,new QTableWidgetItem(list[i].three));
            setItem(i,3,new QTableWidgetItem(list[i].four));
            setItem(i,4,new QTableWidgetItem(list[i].five));
    
        }
    }
    
    void MyTable::ShowTableInfo3()
    {
    
    }
    
    void MyTable::ClearTableInfo()
    {
        setRowCount(0);
        setRowCount(5);
    }
    
    void MyTable::OnItemChange(QTableWidgetItem *item)
    {
        QString str = item->data(Qt::DisplayRole).toString();
        switch (m_type) {
        case PageId::En_Type1:
            SetTableInfo1(str);
            break;
        case PageId::En_Type2:
            SetTableInfo2(str);
            break;
        case PageId::En_Type3:
            break;
        default:{}
        }
    }
    
    

    mywidget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    namespace PageId {
    enum Type{
        En_Type1,
        En_Type2,
        En_Type3
    };
    }
    QT_END_NAMESPACE
    
    class tableInfo
    {
    public:
        QString one;
        QString two;
        QString three;
        QString four;
        QString five;
    };
    class tableInfo1 : public tableInfo
    {
    };
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
        void SetType(PageId::Type type);
    private slots:
        void on_pushButton_clicked();
    
    private:
        Ui::Widget *ui;
        PageId::Type m_type;
    };
    #endif // WIDGET_H
    
    

    mywidget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget),m_type(PageId::En_Type1)
    {
        ui->setupUi(this);
        ui->label->setText("table1");
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::SetType(PageId::Type type)
    {
        m_type = type;
        ui->tableWidget->SetType(m_type);
        ui->tableWidget->initTable();
    }
    
    
    void Widget::on_pushButton_clicked()
    {
        int cnt = ui->lineEdit->text().toInt();
        switch (cnt) {
        case 0:
            SetType(PageId::En_Type1);
            ui->label->setText("table1");
            break;
        case 1:
            SetType(PageId::En_Type2);
            ui->label->setText("table2");
            break;
        case 2:
            SetType(PageId::En_Type3);
            ui->label->setText("table3");
            break;
        default:{}
        }
    }
    
    
    展开全文
  • 1、把下列文件放在工程中【已上传到我的文件中】 2、代码  auto *headview = new HHeadViewClass(Qt::Horizontal, ui.tableWidget); ...setSectionResizeMode(QHeaderView::Interactive);...titleHigh = 5...
  • 很多引用场景中,我们需要使用到QTableWidget来显示内容,如资源管理器中显示的系统信息。使用过程中,对里面的Item进行排序,将显得更加条理可观。 二.使用 下面为一种简单的实现方法: class ...
  • QTableWidget QTableView 自定义复杂表头(多行表头,表头合并) 、冻结、固定特定的行
  • 通过PYQT5做的一个桌面小工具,连接sqlite数据库,自定义表格展示数据,以及表格点击显示出详细数据,供大家参考。
  • 针对QTableWidget实现复选框、编辑功能的demo,在原生可编辑功能上进行了自定义功能的封装,参考此案例可进行自行扩展更多自定义需求开发,针对有自定义功能需求的开发者有一定启发作用,其中包含完整案例,本项目...
  • 第一种:使用QStringList方式  QString labels; labels table....第二种:在自定义模型中实现headerData() QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role
  • 自定义表头,添加复选框和下拉选项框
  • QTableWidget
  • QTableWidget使用自定义代理

    千次阅读 2019-05-12 19:48:11
    QTableWidget表格使用自定义代理,以QLineEdit为例 继承QItemDelegate类 主要重写四个方法 createEditor() setEditorData() setModelData() updateEditorGeometry() #include #include class ...
  • 2.将委托设置给QTableWidget 自定义委托组件 1.继承自QItemDelegate类 2.重写以下函数 virtual QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index...
  • 如果不好计算,可以利用自定义表头排序,但是不知道如何重载排序函数,因为我这个排序是根据数据项排序,既不是升排也不是降序。而且通过查资料都是对列进行排序,没有对表头的数据项进行排序的。 问题相关代码,...
  • QTableWidget自定义委托

    2020-04-21 20:44:21
    QTableWidget单元格使用自定义的lineEdit控件导致不能选中 使用自定义委托解决 1.自定义委托 class LineEditDelegate : public QItemDelegate { Q_OBJECT public: LineEditDelegate(QObject *parent = 0); //...
  • Qt QTableWidget QTableWidget 表头 添加自定义 QHeaderView QCheckBox QCombox 并实现表头控制列 实现效果如下 QTableWidget的表头不能直接添加QWidget,如果需要在表头添加自定义控件,需要继承重写QHeaderView,...
  • 博主进行在做PyQt5软件开发的美化工作,其中遇到一个比较困难的问题是QTableWidget控件的样式设置与自定义。为了帮助遇到与博主类似问题的小伙伴,节省大量查询资料的时间,现单独写了一个QWidget嵌套QTableWidget的...
  • 最近在使用PyQT5做一个项目,用到最多的控件是QTableWidget,使用很方便,但是也存在很多问题,比如下面这种: 数据太长,使用QTableWidget默认的列宽分配会导致显示不全,数据以"XXX..."的形式呈现,很不利于用户...
  • 用于QTreeView、QTableView、QTreeWidget、QTableWidget的定制QHeaderView,实现类似Windows资源管理器中标题栏的效果:鼠标移到标题栏显示箭头按钮,点击后显示下拉菜单,菜单支持多选checkbox。可方便的显示/隐藏...
  • QTableWidget 自定义排序

    千次阅读 2010-10-20 12:13:00
    一种是直接设置每个格子对应的QTableWidgetItem的值,因为QTableWidget默认是据QTableWidgetItem来排序,调用的比较函数是: bool QTableWidgetItem::operator( const QTableWidgetItem & other ) ...
  • 实例QT程序 —— 在QTableWidget表格中添加右键菜单功能。 编译可以直接运行。 运行环境WIN10 Qt5.9.7 。 资源为源码压缩包:QTableWidgetContextMenu.rar 相关文章链接如下: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,015
精华内容 806
关键字:

自定义qtablewidget