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("无法移动:表格没有数据"));
}
}
}
后话
其实最好的方法是利用鼠标进行拖动,这样就需要捕捉鼠标的位置,之后有时间会进行完善更新~