如何使QTableWidget中的列为只读?

74

我希望在QTableWidget中有一列是不可编辑的。
在论坛上我读到了很多关于flags的内容,但是无法实现。

4个回答

110

向 QTableWidget 中插入以下类型的项目:

QTableWidgetItem *item = new QTableWidgetItem();
item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);

运行良好!

编辑:

QTableWidgetItem *item = new QTableWidgetItem();
item->setFlags(item->flags() ^ Qt::ItemIsEditable);

这是一个更好的解决方案。感谢 @priomsrb。


21
最好使用 item->setFlags(item->flags() ^ Qt::ItemIsEditable);。这样可以保留其他标志不变。 - priomsrb
6
为什么你使用异或运算符(XOR),而不是像user2923436建议的那样使用item->flags() & ~Qt::ItemIsEditable?XOR的结果取决于标志的默认状态。 - m7913d
@m7913d 我认为你是对的。我的解决方案只是切换可编辑状态。因此,如果该项已经是只读的,则无法使用。 - priomsrb

52

XOR 的结果取决于当前状态。我建议使用

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

确保编辑被关闭,而不考虑当前设置。


我尝试了你提供的解决方案,但它并没有起作用:编译器对“~”发出了投诉。 - Momergil
4
~ 是按位取反运算符,应该被所有编译器支持。 - kocica

2
我有一个更好的建议,只需用新的SLOT重写cellDoubleClicked信号即可。 也就是说,如果您不希望修改任何单元格。

不需要这样做,这就是为什么我们有项目标志的原因。只需要一行代码就可以解决他的问题。 - reggie
区别在于您必须从所有子项的位图中排除标志。我的建议是,如果您希望整个小部件为只读,则应该排除编写20行带有&~位图标志的代码。实际上,我的评论是错误的,应该是断开cellDoubleClicked信号的连接。 - Damdidam

0

要将 @Narek 的代码应用于行或列,只需使用一个简单的 for 循环,并在其中放置一个条件以包括您不想进行编辑的行/列的标志。

以下代码将 csv 文件读入 QTableWidget:

if(!rowOfData.isEmpty()){
for (int x = 0; x < rowOfData.size(); x++)
    {
        rowData = rowOfData.at(x).split(",");
        if(ui->table_Data->rowCount() <= x) ui->table_Data->insertRow(x);
        for (int y = 0; y < rowData.size(); y++)
        {
            QTableWidgetItem *item = new QTableWidgetItem(rowData[y],QTableWidgetItem::Type);
            if( y < 3 ) item->setFlags(item->flags() ^ Qt::ItemIsEditable);   // Only disables the first three columns for editing, but allows the rest of the columns to be edited
            ui->table_Data->setItem(x,y,item);
            ui->table_Data->repaint();
        }
    }
}

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