背景:
个人笔记,欢迎探讨。
目的是实现用代码设置表格中的选中状态,比如选中某个单元格,或某行,某列。实际上只要能完成选中单元格,行和列都是单元格的集合,道理一样。
QTableWidget比QTableView功能更多,但最根本都是MVC模式的应用。
QTableWidget的每个单元格都是一个item。按照网上普遍的说法,只要搜这个话题,基本都是setCurrentItem,这个确实可以,但如果要选中多个呢?
方法:
我之前想不出来是因为总认为这是QTableWidget的功能,这样确实无法直接搞定。
转换思路,直接操作item即可。亦即:QTableWidgetItem::setSelected(bool select)。
game over。
例子:
比如我要实现选中多个行。直接看头文件:
#ifndef GRID_H
#define GRID_H
#include <QTableWidget>
class Grid : public QTableWidget
{
Q_OBJECT
public:
explicit Grid(QWidget *parent = nullptr);
void f_SetSelectItem(const int &iRow, const int &iCol, const bool &b) { item(iRow, iCol)->setSelected(b); }
void f_SetSelectRow(const int &iRow, const bool &b)
{
for (int iCol = 0; iCol < columnCount(); ++iCol)
{
item(iRow, iCol)->setSelected(b);
}
}
};
#endif // GRID_H
说明,头文件里建议简单高效一些,我是为了省事,简单试一下,所以直接写了循环。
主窗体文件里有一段是这样的:
ui->oGrid->f_SetSelectRow(0, true);
ui->oGrid->f_SetSelectRow(2, true);
前提是,我已经预先给表格设置了行和列,然后添加了item,一定要记着,否则如果设置的位置item是nullptr,肯定报错。
效果如下:
我是随便写了个demo,上面还有一些委托代理,无视即可。重要的是,一次性两行被选中。
本文完。