C ++ QT:QTableWidget;如何让用户选择单元格中的文本而不是编辑它

时间:2015-01-29 20:11:08

标签: c++ qt edit qtablewidget

我正在使用QTableWidget,我要求用户能够突出显示单元格中的特定文本,但如果用户意外删除或修改某些单元格内容,则单元格内容不应更改。我认为实现这一目标的最简单方法是忽略用户完成编辑单元格时发生的任何编辑。任何想法如何做到这一点?

使用C ++ 98和QT

2 个答案:

答案 0 :(得分:1)

您可以访问表格小部件项目并修改其属性您想要禁用Qt::ItemIsEditable标记:

QTableWidgetItem* item;
item->setFlags(item->flags() & ~(Qt::ItemIsEditable));

一种好方法是在将单元格插入表格之前设置项目原型。创建表格后立即

const QtableItem* protoitem = table->itemPrototype();
QtableItem* newprotoitem = protoitem->clone();
newprotoitem->>setFlags(item->flags() & ~(Qt::ItemIsEditable));
table->setItemPrototype(newprotoitem);

现在表中的每个新单元都将禁用可编辑标志。如果用户双击它将不会打开单元格中的文本编辑。

ps:之后不要删除newprotoitem

答案 1 :(得分:1)

这已经很晚了,但对于后续搜索:

执行此操作的最佳方法是将委托子类化(QStyledItemDelegate是最不成问题的 - 没有抽象虚拟)。

在委托中,将“setModelData()”覆盖为存根。编辑器仍然会出现,您仍然可以更改其内容,但编辑不会“采取”。离开单元格后,它将恢复原始内容。

如果要阻止编辑器接受密钥(QLineEdit),请覆盖委托中的“createEditor()”。调用基类来创建编辑器,检查其类型,然后在编辑器上安装事件过滤器以拒绝按键/键释放事件。

在你的覆盖中返回编辑器。

适用于我,虽然我必须使用const_cast'this'(非const)来安装事件过滤器。