9.2、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();
	}
}

ui界面布局样式

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳一航

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值