编辑界面
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();
}
运行效果