ChatGPT解决这个技术问题 Extra ChatGPT

如何使 QTableWidget 中的列只读?

我希望有一个QTableWidget 不可 可编辑的专栏。
在论坛中,我阅读了很多关于某些 flags 的内容,但无法实现。


N
Narek

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

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

工作正常!

编辑:

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

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


最好使用 item->setFlags(item->flags() ^ Qt::ItemIsEditable);。这将使其他标志保持不变
@priomsrb 为什么按照 user2923436 的建议使用异或(XOR)而不是 item->flags() & ~Qt::ItemIsEditable? XOR 的结果取决于标志的默认状态。
@m7913d 我认为你是对的。我的解决方案只是切换可编辑状态。因此,如果该项目已经是只读的,它将不起作用。
A
Angie Quijano

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

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

以确保无论当前设置如何都关闭编辑。


我尝试了你的这个解决方案,但它没有用:编译器抱怨'〜'。
~ 是按位求反,所有编译器都应支持。
D
Damdidam

我提出了一个更好的建议,只需用新的 SLOT 覆盖 cellDoubleClicked 信号。也就是说,如果您不希望修改任何单元格


不需要这样做,这就是我们有项目标志的原因。只需一行就可以解决他的问题。
不同之处在于您必须从他所有子项的位图中排除标志?。如果您希望整个小部件为只读,我的建议是排除使用 &~ 位图标志写入 20 行。实际上我的评论是错误的,应该说断开 cellDoubleClicked 信号
T
Tim Hutchison

要将@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();
        }
    }
}

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅