QTableWidget交换两行的数据,实现按键数据上/下移

QTableWidget交换两行的数据,实现按键数据上/下移

预备操作

  • 在QT designer中添加一个tableWidget
  • 在QT designer中添加两个PushButton
    在这里插入图片描述
    双击tableWidget可以对表头进行修改
    在这里插入图片描述
  • 在程序中,对表格进行初始化
//初始化tableWidget
void MainWidget::initTableWidget() {
	ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//不允许双击修改表格
	ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//一次选择一行
	ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //设置选择模式,选择单行
	ui->tableWidget->setFocusPolicy(Qt::NoFocus); //让table失去焦点
}

得到需要交换的两行的数据

具体的思路是遍历要交换的两行所有数据,加入QStringList中,然后进行交换。

//交换两行数据
void MainWidget::SwapTwoRow(int selectRow, int targetRow) {
	QStringList selectRowLine, targetRowLine;//创建两个QStringList用于储存表格数据
	int rowCount=5;//五列
	for (int i = 0; i < rowCount; i++)
	{
		selectRowLine.append(ui->TableWidget->item(selectRow, i)->text());//获取文本,并添加进QStringLine
		targetRowLine.append(ui->TableWidget->item(targetRow, i)->text());
	}
	for (int i = 0; i < rowCount; i++)
	{
		ui->tableWidget->setItem(selectRow, i, new QTableWidgetItem(targetRowLine.at(i)));//设置文本
		ui->tableWidget->setItem(targetRow, i, new QTableWidgetItem(selectRowLine.at(i)));
	}
}

上移,下移按键的程序

  • 上移按键槽函数
void MainWidget::onUpPushButtonClick()
{
	int m_CurrentRow = ui->tableWidget->currentRow();//获取当前行的Index
	if (m_CurrentRow != -1)//如果选中了数据,(未选择数据之前,返回值是-1)
	{
		if (m_CurrentRow != 0)//如果选定行不在第一行
		{
			SwapTwoRow(m_CurrentRow, m_CurrentRow - 1);
			ui->tableWidget->setCurrentCell(m_CurrentRow - 1, QItemSelectionModel::Select);//移动过后继续选定该行
		}
	}
	else {
		if (ui->tableWidget->rowCount() != 0)//如果有数据,但是currentRow=--1 说明没有选择数据,把焦点定位到第一行
		{
			QMessageBox::critical(this, tr("出现错误"), tr("无法移动:未选中数据"));
		}
		else
		{
			QMessageBox::critical(this, tr("出现错误"), tr("无法移动:表格没有数据"));
		}
	}


}
  • 下移按键槽函数
void MainWidget::onDownPushButtonClick()
{
	int m_CurrentRow = ui->tableWidget->currentRow();
	if (m_CurrentRow != -1)//如果选中了一行
	{
		if (m_CurrentRow != (ui->tableWidget->rowCount() - 1))//如果不是最后一行
		{
			SwapTwoRow(m_CurrentRow, m_CurrentRow + 1);
			ui->tableWidget->setCurrentCell(m_CurrentRow + 1, QItemSelectionModel::Select);//移动过后继续选定该行
		}

	}
	else {
		if (ui->tableWidget->rowCount() != 0)//如果有数据,但是currentRow=--1 说明没有选择数据,把焦点定位到第一行
		{
			QMessageBox::critical(this, tr("出现错误"), tr("无法移动:未选中数据"));
		}
		else
		{
			QMessageBox::critical(this, tr("出现错误"), tr("无法移动:表格没有数据"));
		}
	}

}

后话

其实最好的方法是利用鼠标进行拖动,这样就需要捕捉鼠标的位置,之后有时间会进行完善更新~

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值