Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT:QTable控件;如何让用户选择单元格中的文本而不编辑它_C++_Qt_Edit_Qtablewidget - Fatal编程技术网

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

C++ QT:QTable控件;如何让用户选择单元格中的文本而不编辑它,c++,qt,edit,qtablewidget,C++,Qt,Edit,Qtablewidget,我使用的是QTableWidget,我要求用户能够突出显示单元格中的特定文本,但如果用户意外删除或修改某些单元格内容,则单元格内容不应更改。我认为实现这一点的最简单方法是忽略用户完成单元格编辑时发生的任何编辑。有什么办法吗 < P>使用C++ 98和Qt< P>您可以访问表小部件项并修改它们想要禁用Qt::ITEMISEDITION标志:的属性 一个好方法是在将单元格插入表之前设置项目原型。就在创建表之后 const QtableItem* protoitem = table->itemP

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


< P>使用C++ 98和Qt

< P>您可以访问表小部件项并修改它们想要禁用Qt::ITEMISEDITION标志:

的属性 一个好方法是在将单元格插入表之前设置项目原型。就在创建表之后

const QtableItem* protoitem = table->itemPrototype();
QtableItem* newprotoitem = protoitem->clone();
newprotoitem->>setFlags(item->flags() & ~(Qt::ItemIsEditable));
table->setItemPrototype(newprotoitem);
现在,表中的每个新单元格都将禁用“可编辑”标志。如果用户双击,则不会在单元格中打开文本编辑


注意:以后不要删除newprotoitem。

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

实现这一点的最佳方法是将委托子类化QStyledItemDelegate是问题最少的-没有抽象虚拟

在委托中,将“setModelData”重写为存根。编辑器仍然会出现,您仍然可以更改其内容,但编辑不会“接受”。一旦您离开单元格,它将恢复为其原始内容

如果要阻止编辑器接受键QLineEdit,请在代理中重写“createEditor”。调用基类以创建编辑器,检查其类型,然后在编辑器上安装事件筛选器以拒绝keypress/keyrelease事件

返回覆盖中的编辑器


虽然我必须将“this”强制转换为non-const才能安装事件筛选器,但这对我来说是可行的。

您是否尝试将QTextWidget放入具有适当限制的表单元格中?您能否提供指向QTextWidget文档的链接?我好像找不到。哎呀,我是说QTextEdit。您也可以尝试使用QLabel,它允许用户选择。我确实尝试了这两种方法,但都取得了一些小的成功,但是单元格的选择非常奇怪。基本上,当我单击使用QLabel的单元格时,表的选择不会改变。但我希望用户能够打开每个项目的文本编辑,这样他们就可以从单元格中复制一个小部分。我只想立即恢复所做的任何更改,或在文本编辑中禁用编辑
const QtableItem* protoitem = table->itemPrototype();
QtableItem* newprotoitem = protoitem->clone();
newprotoitem->>setFlags(item->flags() & ~(Qt::ItemIsEditable));
table->setItemPrototype(newprotoitem);