前言
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;
}