C++ QT:QTableWidget;如何使用户能够选择单元格中的文本但不能编辑

3

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

使用 C++ 98 和 QT。


你尝试过使用适当的限制将QTextWidget放入表格单元格中吗? - Victor Polevoy
你能提供一下 QTextWidget 的文档链接吗?我找不到它。 - officialhopsof
哎呀,我是指 QTextEdit。另外你可以尝试放置一个允许用户选择的 QLabel - Victor Polevoy
我尝试过这两种方法,有一些小成功,但是选中单元格的操作非常奇怪。基本上,当我点击使用QLabel的单元格时,表格选择不会改变。 - officialhopsof
2个回答

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);

现在,表格中每个新的单元格都将禁用可编辑标志。如果用户双击它,将不会在单元格中打开文本编辑器。
注:之后不要删除newprotoitem

但我希望用户能够打开每个项目的文本编辑器,这样他们就可以从单元格中复制一小节。我只想让任何更改都立即还原或禁用文本编辑中的编辑。 - officialhopsof

1
这可能有点晚了,但是对于后续搜索:
最好的方法是子类化委托(QStyledItemDelegate是最不问题的 - 没有抽象虚函数)。
在委托中,将“setModelData()”覆盖为存根。编辑器仍然会出现,并且您仍然可以更改其内容,但是编辑不会“接受”。一旦离开单元格,它将恢复其原始内容。
如果要防止编辑器接受键(QLineEdit),请在委托中覆盖“createEditor()”。调用基类以创建编辑器,检查其类型,然后在编辑器上安装事件过滤器以拒绝keypress / keyrelease事件。
在覆盖中返回编辑器。
对我有效,尽管我确实不得不将'this'强制转换为非常量,以安装事件过滤器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接