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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DoleH/article/details/85243175

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失去焦点
}

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

//交换两行数据
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("无法移动:表格没有数据"));
		}
	}

}

猜你喜欢

转载自blog.csdn.net/DoleH/article/details/85243175
今日推荐