I have a QTreeWidgetItem
with two columns of data, is there any way to make only the second column editable? When I do the following:
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setFlags(item->flags() | Qt::ItemIsEditable);
all columns become editable.
You can make only certain columns in a QTreeWidget editable using a workaround:
1) Set the editTriggers property of the QTreeWidget to NoEditTriggers
2) On inserting items, set the Qt:ItemIsEditable flag of the QTreeWidgetItem object
3) Connect the following slot to the "itemDoubleClicked" signal of the QTreeWidget object:
void MainWindow::onTreeWidgetItemDoubleClicked(QTreeWidgetItem * item, int column)
{
if (isEditable(column)) {
ui.treeWidget->editItem(item, column);
}
}
where "isEditable" is a function you wrote that returns true for editable columns and false for non-editable columns.
I had the same problem recently and discovered a solution which works with all EditTriggers, not only the DoubleClicked one (and the connection to the double clicked signal)
Create a Delegate, that returns a NULL Pointer for the editor:
class NoEditDelegate: public QStyledItemDelegate {
public:
NoEditDelegate(QObject* parent=0): QStyledItemDelegate(parent) {}
virtual QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
return 0;
}
};
And later use it as a custom delegate for your column
ui->parameterView->setItemDelegateForColumn(0, new NoEditDelegate(this));
Looks like you will have to forgo using QTreeWidget
and QTreeWidgetItem
and go with QTreeView
and QAbstractItemModel
. The "Widget" classes are convenience classes that are concrete implementations of the more abstract but more flexible versions. QAbstractItemModel
has a call flags(QModelIndex index)
where you would return the appropriate value for your column.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With