Qt tableWidget排序等

前言

tableWidget用于数据显示,继承tableView,想要了解更多关于tableWidget及、tableView。点击qtableview和qtablewidget区别

例子

这里以一个LPL春季赛战队排名数据为例,只搞了前10,可以点击表头排序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关键代码

maindialog.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QProgressBar>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

struct Data{
    QString m_TeamName;
    int m_ranking;
    int m_score;
};
Q_DECLARE_METATYPE(Data)
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private:
    QProgressBar* getBar(int,int);
private:
    Ui::MainWindow *ui;
    QList<bool> m_ListBl;

};
#endif // MAINWINDOW_H

maindialog.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTableWidget>
#include <QHeaderView>
#include <QDebug>
#include <QStyle>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("LPL春季赛战队积分(2020/3/5)");

    // 构造了一个QTableWidget的对象,并且设置为10行,5列
    QTableWidget *tableWidget = new QTableWidget(10,4,this);
    // 也可用下面的方法构造QTableWidget对象
   // QTableWidget *tableWidget = new QTableWidget;
   // tableWidget->setRowCount(10); //设置行数为10
   // tableWidget->setColumnCount(5); //设置列数为5

    tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//禁止编辑
    connect(tableWidget,&QTableWidget::itemDoubleClicked,this,[=](QTableWidgetItem *item){
        Data data = item->data(Qt::UserRole).value<Data>();//取数据
        qDebug()<<"data.m_TeamName:"<<data.m_TeamName
               <<"data.m_ranking:"<<data.m_ranking
              <<"data.m_score:"<<data.m_score;
        QString str = QString("%1 排名:%2 积分:%3").arg(data.m_TeamName).arg(data.m_ranking).arg(data.m_score);
        QMessageBox::about(nullptr,"Data",str);
    });
    connect(tableWidget->horizontalHeader(),&QHeaderView::sectionClicked,this,[=](int row){
        if(m_ListBl.at(row)){
            tableWidget->sortByColumn(row,Qt::AscendingOrder);
        }else{
            tableWidget->sortByColumn(row,Qt::DescendingOrder);
        }
        tableWidget->setSortingEnabled(true);
        m_ListBl[row]=!m_ListBl[row];

    });

   tableWidget->setWindowTitle("QTableWidget & Item");
   tableWidget->resize(size());

   QStringList header;
   header<<"排名"<<"战队"<<"胜率"<<"积分";//标题
   tableWidget->setHorizontalHeaderLabels(header);
   //初始化,为后面排序做准备
   for (int i=0;i<4;i++) {
       m_ListBl.append(false);
   }
   QStringList listName;//战队
   listName<<"WBG"<<"V5"<<"EDG"<<"RNG"<<"LNG"
          <<"TES"<<"JDG"<<"BLG"<<"RA"<<"OMG";
   QList<int> listScore;
   listScore<<9<<9<<8<<8<<8
       <<7<<7<<7<<6<<5;
   QList<int> listTotal;//已打场数
   listTotal<<11<<11<<11<<11<<11
           <<11<<12<<12<<11<<12;
   QList<int> listWin;//胜场
   listWin<<9<<9<<8<<8<<8
         <<7<<7<<7<<6<<5;

   //初始化表格数据
   for (int i=0;i<10;i++){
       //排名
       QTableWidgetItem* pItem = new QTableWidgetItem;
       pItem->setData(Qt::EditRole, i+1);
       tableWidget->setItem(i,0,pItem);
       if(i<3){
           pItem->setIcon(
                 QIcon(QPixmap(QString(":/image/%1.png").arg(i+1)).scaled(QSize(24,24))));
       }
       pItem->setTextAlignment(Qt::AlignCenter);
       //战队名
       tableWidget->setItem(i,1,new QTableWidgetItem(listName.at(i)));
       tableWidget->item(i,1)->setTextAlignment(Qt::AlignCenter);
       if(i==0){
           tableWidget->item(i,1)->setIcon(
                       QIcon(QPixmap(":/image/wbg.png").scaled(QSize(24,24))));
       }else if(i==1){
           tableWidget->item(i,1)->setIcon(
                       QIcon(QPixmap(":/image/v5.png").scaled(QSize(24,24))));
       }else if(i==2){
           tableWidget->item(i,1)->setIcon(
                       QIcon(QPixmap(":/image/edg.png").scaled(QSize(24,24))));
       }
       //胜率
       tableWidget->setCellWidget(i, 2, getBar(listWin.at(i),listTotal.at(i)));
       QTableWidgetItem* pItem_win = new QTableWidgetItem;
       pItem_win->setData(Qt::EditRole, listWin.at(i)*100/listTotal.at(i));
       tableWidget->setItem(i,2,pItem_win);
       pItem_win->setTextAlignment(Qt::AlignCenter);
       //积分
       QTableWidgetItem* pItem_score = new QTableWidgetItem;
       pItem_score->setData(Qt::EditRole, listScore.at(i));
       tableWidget->setItem(i,3,pItem_score);
       pItem_score->setTextAlignment(Qt::AlignCenter);
   }

   for (int i=0;i<10;i++) {
       for (int j=0;j<4;j++) {
           Data data;
           data.m_TeamName = listName.at(i);
           data.m_ranking = i+1;
           data.m_score = listScore.at(i);
           QVariant d ;//利用QVariant保存数据类型
           d.setValue(data);
           tableWidget->item(i,j)->setData(Qt::UserRole, d);
       }
   }
   tableWidget->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}
//设置进度条
QProgressBar* MainWindow::getBar(int percent,int total)
{
    QProgressBar *bar = new QProgressBar;
    bar->setRange(0, total);
    bar->setValue(percent);
    QColor bgColor = QColor(255, 255, 255);

    QColor chunkColor1 = QColor(100, 184, 255);
    QColor chunkColor2 = QColor(24, 189, 155);
    QColor chunkColor3 = QColor(255, 107, 107);

    QColor textColor1 = QColor(10, 10, 10);
    QColor textColor2 = QColor(255, 255, 255);
    QColor textColor3 = QColor(255, 255, 255);

    //进度条样式
    QString qss = QString("QProgressBar{background:%1;border-width:0px;border-radius:0px;text-align:center;}"
                              "QProgressBar::chunk{border-radius:0px;}").arg(bgColor.name());

    if (percent*100/total < 50) {
        qss += QString("QProgressBar{color:%1;}"
                       "QProgressBar::chunk{background:%2;}").arg(textColor1.name()).arg(chunkColor1.name());
    } else if (percent*100/total < 80) {
        qss += QString("QProgressBar{color:%1;}"
                       "QProgressBar::chunk{background:%2;}").arg(textColor2.name()).arg(chunkColor2.name());
    } else {
        qss += QString("QProgressBar{color:%1;}"
                       "QProgressBar::chunk{background:%2;}").arg(textColor3.name()).arg(chunkColor3.name());
    }

    bar->setStyleSheet(qss);
    return bar;
}

源码

点击此处下载源码

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值