ChatGPT解决这个技术问题 Extra ChatGPT

How to make a column in QTableWidget read only?

I would like to have one column in QTableWidget NOT editable.
In forums I have read a lot about some flags but could not manage to implement.


N
Narek

Insert into the QTableWidget following kind of items:

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

Works fine!

EDIT:

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

This is a better solution. Thanks to @priomsrb.


It would be better to use item->setFlags(item->flags() ^ Qt::ItemIsEditable);. This will leave the other flags intact
@priomsrb Why do you use an exclusive or (XOR) instead of item->flags() & ~Qt::ItemIsEditable as suggested by user2923436? The result of XOR depends on the default state of the flags.
@m7913d I think you're right. My solution just toggles the editable state. So it wouldn't work if the item was already read only.
A
Angie Quijano

The result of using XOR depends on what the current state is. I'd suggest using

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

to make sure editing is turned off regardless of the current setting.


I tried this solution of yours and it didn't work: the compiler complained about the '~'.
~ is bitwise negation and should be supported by all compilers.
D
Damdidam

I came to a better suggestion, just overwrite the cellDoubleClicked signal with a new SLOT. This is, if you want none of the cells to be modified


No need to do that, that's why we have item flags. Just one line to fix his problem.
The difference is you would have to exclude the flag from the bitmap on all his child items?. My suggestion was to exclude writing 20 lines with &~ bitmap flag if you want the entire widget to be readonly. Actually my comment was wrong anyway, it should say disconnect the cellDoubleClicked signal
T
Tim Hutchison

To apply @Narek's code to rows or columns, simply use a simple for loop and put a condition in to include the flags for rows/columns you do not want to be editable.

The following code reads a csv file into a 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();
        }
    }
}

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

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now