控件介绍
QTableView
二维数据表视图组件,有多个行和多个列,每个基本显示单元是一个单元格,通过 setModel()
函数设置一个QStandardItemModel
类的数据模型之后,一个单元格显示 QStandardItemModel
数据模型中的一个项。
QStandardItemModel
基于项数据的标准数据模型,可以处理二维数据。维护一个二维的项数据数组,每个项是一个 QStandardltem
类的变量,用于存储项的数据、字体格式、对齐方式等。
QItemSelectionModel
一个用于跟踪视图组件的单元格选择状态的类,当在 QTableView
选择某个单元格,或多个单元格时,通过QItemSelectionModel
可以获得选中的单元格的模型索引,为单元格的选择操作提供方便。
QAbstractItemView::SelectionMode
的介绍
Constant |
Value |
Description |
QAbstractItemView::SingleSelection |
1 |
当用户选择一个项目时,任何已经选择的项目将变为未选择。用户可以取消选择所选项目 |
QAbstractItemView::ContiguousSelection |
4 |
当用户以通常的方式选择一个项目时,选择被清除并选择新项目。但是,如果用户在单击某个项目时按下Shift键,则会选择或取消当前项目和已单击项目之间的所有项目,具体取决于已单击项目的状态 |
QAbstractItemView::ExtendedSelection |
3 |
当用户以通常的方式选择一个项目时,选择被清除并选择新项目。但是,如果用户在单击项目时按下Ctrl键,则所单击的项目将被切换,而其他所有项目将保持不变。如果用户在单击某个项目时按下Shift键,则会选择或取消当前项目和已单击项目之间的所有项目,具体取决于已单击项目的状态。可以通过拖动鼠标在多个项目上进行选择 |
QAbstractItemView::MultiSelection |
2 |
当用户以通常的方式选择一个项目时,该项目的选择状态是切换的,而其他项目将保持不变。多个项目可以通过拖动鼠标来进行切换 |
QAbstractItemView::NoSelection |
0 |
无法选择项目 |
QAbstractItemView::SelectionBehavior
的介绍
Constant |
Value |
Description |
QAbstractItemView::SelectItems |
0 |
Selecting single items |
QAbstractItemView::SelectRows |
1 |
Selecting only rows |
QAbstractItemView::SelectColumns |
2 |
Selecting only columns |
QAbstractItemView::EditTrigger
的介绍
Constant |
Value |
Description |
QAbstractItemView::NoEditTriggers |
0 |
不可能编辑 |
QAbstractItemView::CurrentChanged |
1 |
当前项发生变化时,开始编辑 |
QAbstractItemView::DoubleClicked |
2 |
当双击一个项目时,开始编辑 |
QAbstractItemView::SelectedClicked |
4 |
当单击一个已经选择的项目时进行编辑 |
QAbstractItemView::EditKeyPressed |
8 |
当在一个项目上按下平台编辑键时进行编辑 |
QAbstractItemView::AnyKeyPressed |
16 |
当按下一个项目上的任何键时进行编辑 |
QAbstractItemView::AllEditTriggers |
31 |
开始对以上所有操作进行编辑 |
下面试具体使用:
m_StandardItemModel = new QStandardItemModel(this);
m_ItemSelectionModel = new QItemSelectionModel(m_StandardItemModel);
m_TableView = new QTableView(this);
m_TableView->setModel(m_StandardItemModel);
m_TableView->setSelectionModel(m_ItemSelectionModel);
m_TableView->setSelectionMode(QAbstractItemView::SingleSelection);
m_TableView->setSelectionBehavior(QAbstractItemView::SelectRows);
m_TableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_TableView->horizontalHeader()->setVisible(false);
m_TableView->verticalHeader()->setVisible(false);
添加元素
int iCurRow = m_StandardItemModel->rowCount();
QList<QStandardItem*> aItemList;
QStandardItem *aItem;
for(int i = 0; i < 4; i++)
{
aItem = new QStandardItem(QString("%1, %2").arg(iCurRow).arg(i));
aItem->setTextAlignment(Qt::AlignCenter);
QFont font=aItem->font();
font.setBold(true);
aItem->setFont(font);
aItemList << aItem;
}
m_StandardItemModel->insertRow(iCurRow, aItemList);
QModelIndex curIndex = m_StandardItemModel->index(iCurRow, 0);
m_ItemSelectionModel->clearSelection();
m_ItemSelectionModel->setCurrentIndex(curIndex, QItemSelectionModel::Select);
删除元素
if(m_StandardItemModel->rowCount() == 0)
{
QMessageBox::critical(this, tr("出现错误"), tr("无法删除:没有可删除数据"));
return;
}
QModelIndex curIndex= m_ItemSelectionModel->currentIndex() ;
if(curIndex.row() == -1)
{
QMessageBox::critical(this, tr("出现错误"), tr("无法删除:未选中数据"));
return;
}
else
{
m_StandardItemModel->removeRow(curIndex.row()) ;
QModelIndex index= m_StandardItemModel->index(curIndex.row() - 1,1);
m_TableView->setCurrentIndex(index);
}
上下移动
int iCurrentRow = m_TableView->currentIndex().row();
if (iCurrentRow != -1)
{
if (iCurrentRow != 0)
{
swapTwoRow(iCurrentRow, iCurrentRow - 1, m_StandardItemModel);
QModelIndex index= m_StandardItemModel->index(iCurrentRow - 1,1);
m_TableView->setCurrentIndex(index);
}
}
else
{
if (m_StandardItemModel->rowCount() != 0)
{
QMessageBox::critical(this, tr("出现错误"), tr("无法移动:未选中数据"));
}
else
{
QMessageBox::critical(this, tr("出现错误"), tr("无法移动:表格没有数据"));
}
}
int iCurrentRow = m_TableView->currentIndex().row();
if (iCurrentRow != -1)
{
if (iCurrentRow != (m_StandardItemModel->rowCount() - 1))
{
swapTwoRow(iCurrentRow, iCurrentRow + 1, m_StandardItemModel);
QModelIndex index=m_StandardItemModel->index(iCurrentRow + 1,1);
m_TableView->setCurrentIndex(index);
}
}
else
{
if (m_StandardItemModel->rowCount() != 0)
{
QMessageBox::critical(this, tr("出现错误"), tr("无法移动:未选中数据"));
}
else
{
QMessageBox::critical(this, tr("出现错误"), tr("无法移动:表格没有数据"));
}
}
void MainWindow::swapTwoRow(int selectRow, int targetRow,QStandardItemModel *Model)
{
QStringList selectRowLine, targetRowLine;
for (int i = 0; i < m_StandardItemModel->columnCount(); i++)
{
selectRowLine.append(Model->item(selectRow,i)->text());
targetRowLine.append(Model->item(targetRow,i)->text());
}
for (int i = 0; i < m_StandardItemModel->columnCount(); i++)
{
Model->setData(Model->index(selectRow, i), targetRowLine.at(i));
Model->setData(Model->index(targetRow, i), selectRowLine.at(i));
}
}
清空表格
m_StandardItemModel->clear();
示例代码:
https://download.csdn.net/download/bloke_come/12565014