QT::QTableWidgetTest操作
前言:
本文操作均为在vs2015+QT5.9.5版本中执行
头文件:qtablewidgettest.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_qtablewidgettest.h"
class QTableWidgetTest : public QWidget
{
Q_OBJECT
public:
QTableWidgetTest(QWidget *parent = Q_NULLPTR);
public slots:
void Delect_but();
void ItemEntered(QTableWidgetItem *item);
void CellEntered(int row, int column);
void CellClicked(int row, int column);
void CellDoubleClicked(int row, int column);
void CellChanged(int row, int column);
void SectionClicked(int col);
private:
Ui::QTableWidgetTestClass ui;
};
UI文件:ui_qtablewidgettest.h
/********************************************************************************
** Form generated from reading UI file 'qtablewidgettest.ui'
**
** Created by: Qt User Interface Compiler version 5.9.5
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_QTABLEWIDGETTEST_H
#define UI_QTABLEWIDGETTEST_H
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QTableWidget>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_QTableWidgetTestClass
{
public:
QTableWidget *tableWidget;
QPushButton *delectButton;
void setupUi(QWidget *QTableWidgetTestClass)
{
if (QTableWidgetTestClass->objectName().isEmpty())
QTableWidgetTestClass->setObjectName(QStringLiteral("QTableWidgetTestClass"));
QTableWidgetTestClass->resize(1080, 696);
tableWidget = new QTableWidget(QTableWidgetTestClass);
if (tableWidget->columnCount() < 3)
tableWidget->setColumnCount(3);
QTableWidgetItem *__qtablewidgetitem = new QTableWidgetItem();
tableWidget->setHorizontalHeaderItem(0, __qtablewidgetitem);
QTableWidgetItem *__qtablewidgetitem1 = new QTableWidgetItem();
tableWidget->setHorizontalHeaderItem(1, __qtablewidgetitem1);
QTableWidgetItem *__qtablewidgetitem2 = new QTableWidgetItem();
tableWidget->setHorizontalHeaderItem(2, __qtablewidgetitem2);
if (tableWidget->rowCount() < 3)
tableWidget->setRowCount(3);
QTableWidgetItem *__qtablewidgetitem3 = new QTableWidgetItem();
tableWidget->setVerticalHeaderItem(0, __qtablewidgetitem3);
QTableWidgetItem *__qtablewidgetitem4 = new QTableWidgetItem();
tableWidget->setVerticalHeaderItem(1, __qtablewidgetitem4);
QTableWidgetItem *__qtablewidgetitem5 = new QTableWidgetItem();
tableWidget->setVerticalHeaderItem(2, __qtablewidgetitem5);
QTableWidgetItem *__qtablewidgetitem6 = new QTableWidgetItem();
tableWidget->setItem(0, 0, __qtablewidgetitem6);
QTableWidgetItem *__qtablewidgetitem7 = new QTableWidgetItem();
tableWidget->setItem(0, 1, __qtablewidgetitem7);
QTableWidgetItem *__qtablewidgetitem8 = new QTableWidgetItem();
tableWidget->setItem(0, 2, __qtablewidgetitem8);
QTableWidgetItem *__qtablewidgetitem9 = new QTableWidgetItem();
tableWidget->setItem(1, 0, __qtablewidgetitem9);
QTableWidgetItem *__qtablewidgetitem10 = new QTableWidgetItem();
tableWidget->setItem(1, 2, __qtablewidgetitem10);
QTableWidgetItem *__qtablewidgetitem11 = new QTableWidgetItem();
tableWidget->setItem(2, 0, __qtablewidgetitem11);
QTableWidgetItem *__qtablewidgetitem12 = new QTableWidgetItem();
tableWidget->setItem(2, 1, __qtablewidgetitem12);
QTableWidgetItem *__qtablewidgetitem13 = new QTableWidgetItem();
tableWidget->setItem(2, 2, __qtablewidgetitem13);
tableWidget->setObjectName(QStringLiteral("tableWidget"));
tableWidget->setGeometry(QRect(120, 50, 721, 511));
tableWidget->setStyleSheet(QString::fromUtf8("QHeaderView::section{\n"
" \n"
" background-color: rgbs(57, 191, 194,200);\n"
" height: 60px;\n"
" width: 80px;\n"
" color: rgb(255, 255, 255);\n"
" /*\350\256\276\347\275\256\350\276\271\346\241\206*/\n"
" border:px solid rgbs(255, 0, 255,255);\n"
" font: 12pt \"\351\273\221\344\275\223\";\n"
"}\n"
"QHeaderView::section:checked{/*\351\200\211\344\270\255\347\212\266\346\200\201*/\n"
" background-color: rgbs(57, 160, 160,200);\n"
"}\n"
"QHeaderView::section:hover{\n"
" \n"
" background-color: rgb(170, 170, 255);\n"
"}\n"
"QTableWidget{\n"
" background-color: rgb(244, 249, 250);\n"
" /*\346\224\271\345\217\230\351\200\211\344\270\255\350\241\214\351\242\234\350\211\262*/\n"
" alternate-background-color:rgb(170, 255, 255);\n"
" color: rgb(0, 0, 0);\n"
"}"));
tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
tableWidget->setAutoScroll(true);
tableWidget->setAlternatingRowColors(true);
tableWidget->setIconSize(QSize(0, 0));
tableWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
tableWidget->setGridStyle(Qt::SolidLine);
tableWidget->horizontalHeader()->setCascadingSectionResizes(true);
tableWidget->horizontalHeader()->setDefaultSectionSize(100);
tableWidget->horizontalHeader()->setMinimumSectionSize(50);
tableWidget->horizontalHeader()->setProperty("showSortIndicator", QVariant(false));
tableWidget->verticalHeader()->setVisible(true);
tableWidget->verticalHeader()->setCascadingSectionResizes(true);
tableWidget->verticalHeader()->setDefaultSectionSize(50);
tableWidget->verticalHeader()->setMinimumSectionSize(30);
delectButton = new QPushButton(QTableWidgetTestClass);
delectButton->setObjectName(QStringLiteral("delectButton"));
delectButton->setGeometry(QRect(900, 70, 121, 51));
retranslateUi(QTableWidgetTestClass);
QMetaObject::connectSlotsByName(QTableWidgetTestClass);
} // setupUi
void retranslateUi(QWidget *QTableWidgetTestClass)
{
QTableWidgetTestClass->setWindowTitle(QApplication::translate("QTableWidgetTestClass", "QTableWidgetTest", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem = tableWidget->horizontalHeaderItem(0);
___qtablewidgetitem->setText(QApplication::translate("QTableWidgetTestClass", "\346\226\260\345\273\272\345\210\2271", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem1 = tableWidget->horizontalHeaderItem(1);
___qtablewidgetitem1->setText(QApplication::translate("QTableWidgetTestClass", "\346\226\260\345\273\272\345\210\2272", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem2 = tableWidget->horizontalHeaderItem(2);
___qtablewidgetitem2->setText(QApplication::translate("QTableWidgetTestClass", "\346\226\260\345\273\272\345\210\2273", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem3 = tableWidget->verticalHeaderItem(0);
___qtablewidgetitem3->setText(QApplication::translate("QTableWidgetTestClass", "\346\226\260\345\273\272\350\241\2141", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem4 = tableWidget->verticalHeaderItem(1);
___qtablewidgetitem4->setText(QApplication::translate("QTableWidgetTestClass", "\346\226\260\345\273\272\350\241\2142", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem5 = tableWidget->verticalHeaderItem(2);
___qtablewidgetitem5->setText(QApplication::translate("QTableWidgetTestClass", "\346\226\260\345\273\272\350\241\2143", Q_NULLPTR));
const bool __sortingEnabled = tableWidget->isSortingEnabled();
tableWidget->setSortingEnabled(false);
QTableWidgetItem *___qtablewidgetitem6 = tableWidget->item(0, 0);
___qtablewidgetitem6->setText(QApplication::translate("QTableWidgetTestClass", "1.0Test", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem7 = tableWidget->item(0, 1);
___qtablewidgetitem7->setText(QApplication::translate("QTableWidgetTestClass", "1.1Test", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem8 = tableWidget->item(0, 2);
___qtablewidgetitem8->setText(QApplication::translate("QTableWidgetTestClass", "1.2Test", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem9 = tableWidget->item(1, 0);
___qtablewidgetitem9->setText(QApplication::translate("QTableWidgetTestClass", "2.1Test", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem10 = tableWidget->item(1, 2);
___qtablewidgetitem10->setText(QApplication::translate("QTableWidgetTestClass", "2.2Test", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem11 = tableWidget->item(2, 0);
___qtablewidgetitem11->setText(QApplication::translate("QTableWidgetTestClass", "3.0Test", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem12 = tableWidget->item(2, 1);
___qtablewidgetitem12->setText(QApplication::translate("QTableWidgetTestClass", "3.1Test", Q_NULLPTR));
QTableWidgetItem *___qtablewidgetitem13 = tableWidget->item(2, 2);
___qtablewidgetitem13->setText(QApplication::translate("QTableWidgetTestClass", "3.2Test", Q_NULLPTR));
tableWidget->setSortingEnabled(__sortingEnabled);
delectButton->setText(QApplication::translate("QTableWidgetTestClass", "Delect", Q_NULLPTR));
} // retranslateUi
};
namespace Ui {
class QTableWidgetTestClass: public Ui_QTableWidgetTestClass {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_QTABLEWIDGETTEST_H
主函数:main.cpp
#include "qtablewidgettest.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTableWidgetTest w;
w.show();
return a.exec();
}
实现文件:qtablewidgettest.cpp
#include "qtablewidgettest.h"
#include <QDebug>
#include <QLabel>
#include <set>
#include <QMessageBox>
using std::set;
class MyHead : public QTableWidgetItem
{
public:
MyHead(QString text) :QTableWidgetItem(text)
{
}
~MyHead()
{
qDebug() << this->text() << "remove" ;
}
};
QTableWidgetTest::QTableWidgetTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//清空数据,
/************************************************************************************************************/
//使用clear()只会清空数据,(PS:本次清空不用这个方法)
ui.tableWidget->clear();
//使用下列方法会清空已有的行和列以及所有数据
ui.tableWidget->setColumnCount(0);
ui.tableWidget->setRowCount(0);
//打开鼠标跟踪
ui.tableWidget->setMouseTracking(true);
/************************************************************************************************************/
//添加"行"和"列"以及修改"列宽度"
/************************************************************************************************************/
//添加TableWidget的列:
ui.tableWidget->setColumnCount(5);
//方法一:
//用setHorizontalHeaderItem(int (列)column, new QTableWidgetItem *item("const QString &(名称)text,"));
ui.tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Head 1"));
ui.tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem);
ui.tableWidget->horizontalHeaderItem(1)->setText("Head 2");
//方法二:
//用自己写的类继承QTableWidgetItem来进行覆写,或者自定义
ui.tableWidget->setHorizontalHeaderItem(2, new MyHead("H3"));
//第二次创建列到之前的下标处会覆盖之前的(会清理掉之前的数据)
ui.tableWidget->setHorizontalHeaderItem(2, new MyHead("Head 3"));
ui.tableWidget->setHorizontalHeaderItem(3, new QTableWidgetItem("Head 4"));
ui.tableWidget->setHorizontalHeaderItem(4, new QTableWidgetItem("Head 5"));
//设置标题列的宽度
ui.tableWidget->setColumnWidth(0, 200);//setColumnWidth(列, 宽度大小)
//添加TableWidget的行:
ui.tableWidget->setRowCount(3);
//方法一:
QStringList List = { "Row 1","Row 2"};
//vs2017之前的版本插入方法: //List.push_back("Row 1");
ui.tableWidget->setVerticalHeaderLabels(List);
//方法二:和之前列的插入方法基本一样
ui.tableWidget->setVerticalHeaderItem(2, new QTableWidgetItem("Row 3"));
/************************************************************************************************************/
//插入
/************************************************************************************************************/
//插入数据
//插入到第一行数据
ui.tableWidget->setItem(0, 0, new QTableWidgetItem("col 0,0"));
ui.tableWidget->setItem(0, 1, new QTableWidgetItem("col 0,1"));
ui.tableWidget->setItem(0, 2, new QTableWidgetItem("col 0,2"));
ui.tableWidget->setItem(0, 3, new QTableWidgetItem("col 0,3"));
ui.tableWidget->setItem(0, 4, new QTableWidgetItem("col 0,4"));
//插入到第二行数据
ui.tableWidget->setItem(1, 0, new QTableWidgetItem("col 1,0"));
ui.tableWidget->setItem(1, 2, new QTableWidgetItem("col 1,2"));
//插入到第三行数据
ui.tableWidget->setItem(2, 0, new QTableWidgetItem("col 2,0"));
//添加行
//开头处添加行
ui.tableWidget->insertRow(0);
ui.tableWidget->setVerticalHeaderItem(0, new QTableWidgetItem("Row 0"));
ui.tableWidget->setItem(0, 0, new QTableWidgetItem("col 0 0"));
//结尾处添加行
int row = ui.tableWidget->rowCount();
ui.tableWidget->insertRow(row);
ui.tableWidget->setVerticalHeaderItem(row, new QTableWidgetItem("Row row"));
ui.tableWidget->setItem(row, 0, new QTableWidgetItem("col row 0"));
//插入图片Icon
ui.tableWidget->setItem(0, 1, new QTableWidgetItem);
ui.tableWidget->item(0,1)->setIcon(QIcon("five.png"));
ui.tableWidget->setRowHeight(0,80);//设置行高
ui.tableWidget->setIconSize(QSize(ui.tableWidget->rowHeight(0), ui.tableWidget->rowHeight(0)));
//插入图片QLable
/************************************************************************************************************/
QLabel *img = new QLabel();
QPixmap pix("five.png");
ui.tableWidget->setRowHeight(row, ui.tableWidget->columnWidth(0));//设置行高
/* 设置大小
QPixmap scaled(int w, int h,PS:这后面还能跟三种模式,我没有复制过来,详细看定义) const
{
return scaled(QSize(w, h));
}
*/
//PS:看上面需要传参的函数,或者转到定义去查看
pix = pix.scaled(ui.tableWidget->columnWidth(0), ui.tableWidget->rowHeight(row));
img->setPixmap(pix);//传入图片到QLabel
ui.tableWidget->setCellWidget(row, 0, img);//设置QLabel到tableWidget中去
/************************************************************************************************************/
//信号与槽链接
/************************************************************************************************************/
//Delect_but()删除按钮链接
connect(ui.delectButton,SIGNAL(clicked()),this,SLOT(Delect_but()));
//鼠标悬停事件,不支持自定义widget;空行无效
connect(ui.tableWidget, SIGNAL(itemEntered(QTableWidgetItem *)), this, SLOT(ItemEntered(QTableWidgetItem *)));
//鼠标悬停事件,空行有效
connect(ui.tableWidget, SIGNAL(cellEntered(int, int)), this, SLOT(CellEntered(int, int)));
//鼠标单击事件,左击有效
connect(ui.tableWidget, SIGNAL(cellClicked(int, int)), this, SLOT(CellClicked(int, int)));
//鼠标双击事件,左右双击皆有效
connect(ui.tableWidget, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(CellDoubleClicked(int, int)));
//移开项目(Item)后cellChanged有效触发
connect(ui.tableWidget, SIGNAL(cellChanged(int, int)), this, SLOT(CellChanged(int, int)));
//HSectionClicked(int col)
//标题栏点击信号事件(用来排序最好)
connect(ui.tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(SectionClicked(int)));//列
connect(ui.tableWidget->verticalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(SectionClicked(int)));//行
}
/************************************************************************************************************/
void QTableWidgetTest::Delect_but()
{
//item遍历查询
//selectedItems()选定的项目,由于类型为 QList<QTableWidgetItem*>所有要用items来存储项目数据
QList<QTableWidgetItem*> items = ui.tableWidget->selectedItems();
//遍历
for (int i=0;i<items.size();i++)
{
qDebug() << qPrintable(QString("Row:")) << items[i]->row()<<"\t" //获取行
<< qPrintable(QString("Column:")) << items[i]->column() << "\t" //获取列
<< qPrintable(QString("Text:")) << items[i]->text(); //获取文本
}
//删除行
//选择模式
QItemSelectionModel *smodel =ui.tableWidget->selectionModel();//存放选中的数据
//获取所有选定的索引
QModelIndexList slist = smodel->selectedIndexes();//存放选中的索引
//set是有序和不重复。
set<int> rows;//存放索引
for (int i = 0; i < slist.size(); i++)
{
//重复插入会失败
rows.insert(slist[i].row());
}
//用户提示
QString msg = QString::fromLocal8Bit("请确认是否删除!");
set<int>::iterator itr;
for (auto itr : rows)
{
QTableWidgetItem *item;
item = ui.tableWidget->item(itr, 0);
msg += "[";
//打印行号
msg += QString::number(itr+1);
msg += "]";
if (item) {
//打印文本
msg += item->text();
msg += "]";
}
/*
re是存放按钮状态的
QString::fromLocal8Bit("确认")对应:(int defaultButtonNumber = 0)
QString::fromLocal8Bit("取消")对应:(int escapeButtonNumber = -1;)
*/
int re = QMessageBox::information(this, "", msg, QString::fromLocal8Bit("确认"), QString::fromLocal8Bit("取消"));
if (re != 0)
{
return;
}
for (;;)//死循环
{
//获取选中的所有索引
QModelIndexList s = smodel->selectedIndexes();
if (s.size() <= 0)//如果没有索引就退出
{
break;
}
//删除一行
ui.tableWidget->removeRow(s[0].row());
}
}
}
/************************************************************************************************************/
void QTableWidgetTest::ItemEntered(QTableWidgetItem *item)
{
//存放打印数据
QString msg = "ItemEnterede:";
if (item)
{
msg += "Row:";
msg += QString::number(item->row());
msg += " ";
msg += "Column:";
msg += QString::number(item->column());
msg += " ";
msg += "Text:";
msg += item->text();
}
qDebug() << msg;
}
void QTableWidgetTest::CellEntered(int row, int column)
{
//存放打印数据
QString msg = "CellEntered:";
QTableWidgetItem *item = ui.tableWidget->item(row, column);
//由于行号和列号一定会有,可以不判定
msg += "Row:";
msg += QString::number(row);
msg += " ";
msg += "Column:";
msg += QString::number(column);
if (item)
{
msg += " ";
msg += "Text:";
msg += item->text();
}
qDebug() << msg;
}
void QTableWidgetTest::CellClicked(int row, int column)
{
//存放打印数据
QString msg = "CellClicked:";
QTableWidgetItem *item = ui.tableWidget->item(row, column);
//由于行号和列号一定会有,可以不判定
msg += "Row:";
msg += QString::number(row);
msg += " ";
msg += "Column:";
msg += QString::number(column);
if (item)
{
msg += " ";
msg += "Text:";
msg += item->text();
}
qDebug() << msg;
}
void QTableWidgetTest::CellDoubleClicked(int row, int column)
{
//存放打印数据
QString msg = "CellDouble:";
QTableWidgetItem *item = ui.tableWidget->item(row, column);
//由于行号和列号一定会有,可以不判定
msg += "Row:";
msg += QString::number(row);
msg += " ";
msg += "Column:";
msg += QString::number(column);
if (item)
{
msg += " ";
msg += "Text:";
msg += item->text();
}
qDebug() << msg;
}
void QTableWidgetTest::CellChanged(int row, int column)
{
//存放打印数据
QString msg = "CellChanged:";
QTableWidgetItem *item = ui.tableWidget->item(row, column);
//由于行号和列号一定会有,可以不判定
msg += "Row:";
msg += QString::number(row);
msg += " ";
msg += "Column:";
msg += QString::number(column);
if (item)
{
msg += " ";
msg += "Text:";
msg += item->text();
}
qDebug() << msg;
}
void QTableWidgetTest::SectionClicked(int col)
{
QTableWidgetItem *h = ui.tableWidget->horizontalHeaderItem(col);//获取行标题
qDebug() << "HSectionClicked" << col;
if (h)
{
qDebug() << h->text();
}
QTableWidgetItem *v = ui.tableWidget->verticalHeaderItem(col);//获取列标题
qDebug() << "VSectionClicked" << col;
if (v)
{
qDebug() << v->text();
}
}