QTableWidget相关操作

编辑界面

在这里插入图片描述

TableWidgetEx .h文件

#ifndef TABLEWIDGETEX_H
#define TABLEWIDGETEX_H

#include <QWidget>
#include <QTableWidget>
#include <QTableWidgetItem>

//编辑类型
enum ModifyType_t
{
	ModifyType_New,//新增
	ModifyType_Edit,//修改
};


struct exSt
{
	QString m_name;//名称
	QString m_desc;//描述
	QString m_type;//类别
	QString m_sate;//状态
	QString m_time;//时间
};

class TableWidgetEx : public QWidget
{
    Q_OBJECT

public:
    explicit TableWidgetEx(QWidget *parent = 0);
    ~TableWidgetEx();

    //初始化表格
    void InitTableWidget();

	//清空表格
	void ClearTableWidget();

	//往表格中插入一行数据
	void InsertOneRowToTableWidget(exSt v_exSt);
	
	//修改表格某一行的数据
	void UpdateTableWidgetOneRow(exSt v_exSt, int row);

private slots:
	//右键菜单
	void on_ContextMenuRequested(const QPoint & pos);

	//新增槽函数
	void AddTriggerAction();

	//删除槽函数
	void DeleteTriggerAction();

	//双击槽函数
	void slot_itemDoubleClicked(QTableWidgetItem * item);

	//表格当前项改变槽函数
	void slot_itemChanged(QTableWidgetItem * current, QTableWidgetItem * previous);

private:

	QTableWidget* m_tableWidget = nullptr;

	//当前行
	int m_currentRow;

	//结构体列表
	QList<exSt> m_exStList;

	//当前结构体
	exSt* m_exSt = nullptr;
};

#endif // TABLEWIDGETEX_H

TableWidgetEx .cpp文件

#include "TableWidgetEx.h"
#include <QHeaderView>
#include <QMenu>
#include <QMessageBox>
#include <QVBoxLayout>

#include "EditDlg.h"

//解决中文乱码
#pragma execution_character_set("utf-8")

TableWidgetEx::TableWidgetEx(QWidget *parent) :
    QWidget(parent)
{
	//初始化表格
	InitTableWidget();

	//添加到布局
	QVBoxLayout* lay = new QVBoxLayout(this);
	lay->setMargin(0);
	lay->setSpacing(0);
	setLayout(lay);
	lay->addWidget(m_tableWidget);

}

TableWidgetEx::~TableWidgetEx()
{
}

//************************************
// 方法名称:	InitTableWidget
// 概要:		初始化表格
// 方法全称:	TableWidgetEx::InitTableWidget
// 访问权限:	public
// 返回值:		void
// 参数:		void
//************************************
void TableWidgetEx::InitTableWidget()
{
    m_tableWidget = new QTableWidget(this);

    //自适应宽度
	m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
    //使行列头自适应宽度,最后一列将会填充空白部分
    m_tableWidget->horizontalHeader()->setStretchLastSection(true);

    //设置行选中
    m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    //选中多行,可以使用shift,ctrl
    //SingleSelection-单选
    //MultiSelection-多选
    //ExtendedSelection-支持shift,ctrl和Ctr+A操作
    m_tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);

    //禁止编辑
    m_tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

    //设置右键菜单
    m_tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);

    //设置表头
    QStringList top;
    top << QString("名称") << QString("描述") << QString("类别") << QString("状态") << QString("时间");
    int nColCouunt = top.size();
    m_tableWidget->setColumnCount(nColCouunt); //设置列数
    m_tableWidget->setHorizontalHeaderLabels(top);

    //设置列宽
    m_tableWidget->setColumnWidth(0, 150);
    m_tableWidget->setColumnWidth(1, 200);
    m_tableWidget->setColumnWidth(2, 150);
    m_tableWidget->setColumnWidth(3, 80);
    m_tableWidget->setColumnWidth(4, 120);

    //当前选中项改变
    connect(m_tableWidget, &QTableWidget::currentItemChanged, this, &TableWidgetEx::slot_itemChanged);

    //右键菜单
    connect(m_tableWidget, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(on_ContextMenuRequested(const QPoint &)));

    //双击响应函数
    connect(m_tableWidget, SIGNAL(itemDoubleClicked(QTableWidgetItem *)), this, SLOT(slot_itemDoubleClicked(QTableWidgetItem *)));

}

//************************************
// 方法名称:	slot_itemChanged
// 概要:		表格当前项改变槽函数
// 方法全称:	TableWidgetEx::slot_itemChanged
// 访问权限:	private 
// 返回值:		void
// 参数:		QTableWidgetItem * current
// 参数:		QTableWidgetItem * previous
//************************************
void TableWidgetEx::slot_itemChanged(QTableWidgetItem * current, QTableWidgetItem * previous)
{
	if (current == nullptr) return;
	int row = current->row();
	if (row < 0 || row >= m_exStList.count())
	{
		m_exSt = nullptr;
		return;
	}

	m_exSt = &m_exStList[row];
	m_currentRow = row;

}

//************************************
// 方法名称:	ClearTableWidget
// 概要:		清空表格
// 方法全称:	TableWidgetEx::ClearTableWidget
// 访问权限:	public
// 返回值:		void
// 参数:		void
//************************************
void TableWidgetEx::ClearTableWidget()
{
	//清空表格
	for (int i = m_tableWidget->rowCount() - 1; i >= 0; i--)
	{
		m_tableWidget->removeRow(i);
	}

	m_currentRow = -1;
}

//************************************
// 方法名称:	on_ContextMenuRequested
// 概要:		显示菜单
// 方法全称:	DemandOverview_Item::on_ContextMenuRequested
// 访问权限:	private 
// 返回值:		void
// 参数:		const QPoint &
//************************************
void TableWidgetEx::on_ContextMenuRequested(const QPoint & pos)
{
	QMenu contextMenu;

	//添加菜单项
	QAction* action1 = new QAction(&contextMenu);
	action1->setObjectName("新增");
	action1->setText(tr("新增"));
	action1->setIcon(QIcon(":/resource/images/add.png"));

	contextMenu.addAction(action1);

	//获取当前行
	int row = m_tableWidget->currentRow();
	if (row >= 0)
	{
		QAction* action2 = new QAction(&contextMenu);
		action2->setObjectName("删除");
		action2->setText(tr("删除"));
		action2->setIcon(QIcon(":/resource/images/delete.png"));
		contextMenu.addAction(action2);

		//删除
		connect(action2, SIGNAL(triggered()), this, SLOT(DeleteTriggerAction()));
	}

	//新增
	connect(action1, SIGNAL(triggered()), this, SLOT(AddTriggerAction()));

	//显示菜单
	contextMenu.exec(m_tableWidget->mapToGlobal(pos));
}

//************************************
// 方法名称:	AddTriggerAction
// 概要:		新增
// 方法全称:	TableWidgetEx::AddTriggerAction
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void TableWidgetEx::AddTriggerAction()
{
	exSt* addExSt = new exSt();
	EditDlg addDlg(addExSt, ModifyType_New);
	if (QDialog::Accepted != addDlg.exec())
	{
		delete addExSt;
		addExSt = nullptr;
		return;
	}

	//插入列表
	m_exStList.append(*addExSt);

	//添加到界面列表
	InsertOneRowToTableWidget(*addExSt);
}

//************************************
// 方法名称:	DeleteTriggerAction
// 概要:		删除
// 方法全称:	TableWidgetEx::DeleteTriggerAction
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void TableWidgetEx::DeleteTriggerAction()
{
	int row = m_tableWidget->currentRow();
	if (row < 0)
	{
		return;
	}
	//获取功能点描述
	QString name = m_tableWidget->item(row, 0)->text();

	QMessageBox msgbox(QMessageBox::Information, "提示", QString("确定要删除\"%1\"吗?").arg(name), QMessageBox::No | QMessageBox::Yes, this);
	msgbox.setDefaultButton(QMessageBox::No);
	if (QMessageBox::Yes != msgbox.exec())
	{
		return;
	}

	//从界面移除
	m_tableWidget->removeRow(row);

}

//************************************
// 方法名称:	slot_itemDoubleClicked
// 概要:		表格双击槽函数
// 方法全称:	TableWidgetEx::slot_itemDoubleClicked
// 访问权限:	private 
// 返回值:		void
// 参数:		QTableWidgetItem * item
//************************************
void TableWidgetEx::slot_itemDoubleClicked(QTableWidgetItem * item)
{
	if (item == nullptr) return;
	//获取行号
	int row = item->row();
	if (row < 0)
	{
		m_exSt = nullptr;
		return;
	}
	m_exSt = &m_exStList[row];
	m_currentRow = row;

	//获取对应的结构体
	exSt editExSt = m_exStList[row];
	//修改功能点
	EditDlg editDlg(&editExSt, ModifyType_Edit);
	if (QDialog::Accepted != editDlg.exec())
	{
		return;
	}
	//替换新的结构体
	m_exStList[row] = editExSt;
	//修改界面数据
	UpdateTableWidgetOneRow(editExSt, row);
}

//************************************
// 方法名称:	InsertOneRowToTableWidget
// 概要:		往表格中插入一行
// 方法全称:	TableWidgetEx::InsertOneRowToTableWidget
// 访问权限:	private
// 返回值:		void
// 参数:		exSt v_exSt 结构体
//************************************
void TableWidgetEx::InsertOneRowToTableWidget(exSt v_exSt)
{
	int row = m_tableWidget->rowCount();
	m_tableWidget->insertRow(row);
	//名称
	m_tableWidget->setItem(row, 0, new QTableWidgetItem(v_exSt.m_name));
	//描述
	m_tableWidget->setItem(row, 1, new QTableWidgetItem(v_exSt.m_desc));
	//类别
	m_tableWidget->setItem(row, 2, new QTableWidgetItem(v_exSt.m_type));
	//状态
	m_tableWidget->setItem(row, 3, new QTableWidgetItem(v_exSt.m_sate));
	//时间
	m_tableWidget->setItem(row, 4, new QTableWidgetItem(v_exSt.m_time));

}

//************************************
// 方法名称:	UpdateTableWidgetOneRow
// 概要:		修改表格某一行的数据
// 方法全称:	TableWidgetEx::UpdateTableWidgetOneRow
// 访问权限:	private
// 返回值:		void
// 参数:		exSt v_exSt 结构体
// 参数:		int row 行号
//************************************
void TableWidgetEx::UpdateTableWidgetOneRow(exSt v_exSt, int row)
{
	if (row >= m_tableWidget->rowCount() || row < 0) return;

	//名称
	m_tableWidget->item(row, 0)->setText(v_exSt.m_name);
	//描述
	m_tableWidget->item(row, 1)->setText(v_exSt.m_desc);
	//类别
	m_tableWidget->item(row, 2)->setText(v_exSt.m_type);
	//状态
	m_tableWidget->item(row, 3)->setText(v_exSt.m_sate);
	//时间
	m_tableWidget->item(row, 4)->setText(v_exSt.m_time);
}

EditDlg.h文件

#ifndef EDITDLG_H
#define EDITDLG_H

#include <QDialog>

#include "TableWidgetEx.h"

namespace Ui {
class EditDlg;
}

class EditDlg : public QDialog
{
    Q_OBJECT

public:
    explicit EditDlg(exSt* editExSt,ModifyType_t mt, QWidget *parent = 0);
    ~EditDlg();

private slots:
	//确定按钮槽函数
    void on_btn_ok_clicked();

	//取消按钮槽函数
    void on_btn_cancel_clicked();

private:
    Ui::EditDlg *ui;

	//结构体指针
	exSt* m_exSt;

	//编辑类型 新增/修改
	ModifyType_t m_mt;

};

#endif // EDITDLG_H

EditDlg.cpp文件

#include "EditDlg.h"
#include "ui_EditDlg.h"

#include <QMessageBox>

//解决中文乱码
#pragma execution_character_set("utf-8")


EditDlg::EditDlg(exSt* editExSt, ModifyType_t mt, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::EditDlg)
{
    ui->setupUi(this);
	m_exSt = editExSt;
	m_mt = mt;

	if (mt == ModifyType_New)
	{
		setWindowTitle("新增");
		//获取当前时间
		QDateTime time = QDateTime::currentDateTime();
		ui->dateTimeEdit->setDateTime(time);
	}
	else if (m_exSt != nullptr)
	{
		setWindowTitle("编辑");
		//名称
		ui->lineEdit->setText(m_exSt->m_name);
		//描述
		ui->textEdit->setText(m_exSt->m_desc);
		//类别
		int indexType = ui->cb_type->findText(m_exSt->m_type);
		ui->cb_type->setCurrentIndex(indexType);
		//状态
		int indexState = ui->cb_state->findText(m_exSt->m_sate);
		ui->cb_state->setCurrentIndex(indexState);
		//时间
		ui->dateTimeEdit->setDateTime(QDateTime::fromString(m_exSt->m_time, "yyyy-MM-dd hh:mm:ss"));
	}

}

EditDlg::~EditDlg()
{
    delete ui;
}

//确定按钮槽函数
void EditDlg::on_btn_ok_clicked()
{
	QString strName = ui->lineEdit->text();
	if (strName.isEmpty() || strName.isNull() || strName == "")
	{
		QMessageBox::information(this, QString("提示"), QString("名称不能为空"));
		return;
	}
	//名称
	m_exSt->m_name = ui->lineEdit->text();
	//描述
	m_exSt->m_desc = ui->textEdit->toPlainText();
	//类别
	m_exSt->m_type = ui->cb_type->currentText();
	//状态
	m_exSt->m_sate = ui->cb_state->currentText();
	//时间
	m_exSt->m_time = ui->dateTimeEdit->dateTime().toString("yyyy-MM-dd hh:mm:ss");

    accept();
}

//取消按钮槽函数
void EditDlg::on_btn_cancel_clicked()
{
    reject();
}

运行效果


主界面

新增窗口
编辑窗口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值