Изготовление только одного столбца QtreewidetEtem редактируемого

StackOverflow https://stackoverflow.com/questions/2801959

  •  25-09-2019
  •  | 
  •  

Вопрос

у меня есть QTreeWidgetItem С двумя столбцами данных есть ли способ сделать только второй столбец редактируемой? Когда я делаю следующее:

QTreeWidgetItem* item = new QTreeWidgetItem();
item->setFlags(item->flags() | Qt::ItemIsEditable);

Все колонны становятся редактируемыми.

Это было полезно?

Решение

Похоже, вам придется отказаться от использования QTreeWidget а также QTreeWidgetItem и пойти с QTreeView а также QAbstractItemModel. Отказ Классы «Виджет» - это удобные классы, которые являются конкретными реализациями более абстрактных, но более гибких версий. QAbstractItemModel имеет звонок flags(QModelIndex index) Где вы вернете соответствующее значение для вашей колонки.

Другие советы

Вы можете сделать только определенные столбцы в qtreewidget Reeditable, используя обходной путь:

1) Установите свойство edittrigger of the qtreewidget в noedittriggers

2) При вставке элементов установите QT: Детализируемый флаг объекта QTrewidgetTem

3) Подключите следующий слот к сигналу «ItemDoubleClicked» объекта QTreeWidget:

void MainWindow::onTreeWidgetItemDoubleClicked(QTreeWidgetItem * item, int column)
{
    if (isEditable(column)) {
        ui.treeWidget->editItem(item, column);
    }
}

Где «Iseditable» - это функция, которую вы написали, что возвращает для редактируемых столбцов и ложь для не редактируемых колонн.

У меня была одна и та же проблема недавно и обнаружила решение, которое работает со всеми редакторами, не только DoubleClicked One (и соединение с двойным щелчком сигнала)

Создайте делегат, который возвращает нулевой указатель для редактора:

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;
      }
    };

И позже используйте его как пользовательский делегат для вашей колонки

ui->parameterView->setItemDelegateForColumn(0, new NoEditDelegate(this));

Похоже, стандартный Qtreewidget не позволяет этого не позволяет. Я думаю, что есть два способа сделать это:

  1. Используйте QTreeView со своим собственным классом, полученным из QABSTRACTITEMMODEL и переопределить функцию флагов

  2. Используйте QtreeView с q sставослучайно. Затем, когда вы добавите элемент, просто установите соответствующий столбец, чтобы разрешить редактировать:

Вот какой-то код для второго варианта:

QString x, y;
QList<QStandardItem*> newIt;
QStandardItem * item = new QStandardItem(x);
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled);
newIt.append(item);
item = new QStandardItem(y);
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsEditable);
newIt.append(item);
model->appendRow(newIt);

Я нахожу второй подход проще, но это зависит от того, сколько гибкости вы хотите с вашей моделью.

Самый простой способ, которым я нашел, должен был использовать Qt :: enterflags

void myClass::treeDoubleClickSlot(QTreeWidgetItem *item, int column)
{
    Qt::ItemFlags tmp = item->flags();
    if (isEditable(item, column)) {
        item->setFlags(tmp | Qt::ItemIsEditable);
    } else if (tmp & Qt::ItemIsEditable) {
        item->setFlags(tmp ^ Qt::ItemIsEditable);
    }
}

Верх if Добавляет функциональность редактирования через OR, и нижние проверки, если это там с AND, затем удаляет его с XOR.

Таким образом, функциональность редактирования добавляется, когда вы хотите, и удалены, когда вы этого не сделаете.

Затем подключите эту функцию к виджету дерева itemDoubleClicked() сигнал и напишите свой «редактировать или не редактировать» решение внутри isEditable()

class EditorDelegate : public QItemDelegate
{
    Q_OBJECT

public:
    EditorDelegate(QObject *parent):QItemDelegate(parent){};
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

QWidget* EditorDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(index.column() == 1)
    {
        return QItemDelegate::createEditor(parent, option, index);
    }
    return nullptr;
}

в QTreeWidget:

myQTreeWidget::myQTreeWidget()
{
    EditorDelegate *d = new EditorDelegate(this);
    this->setItemDelegate(d);
}

Может быть, немного поздно, но может помочь:

void MyClass::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column) {
    Qt::ItemFlags flags = item->flags();
    if(column == 0)
    {
        item->setFlags(flags & (~Qt::ItemIsEditable));
    }
    else
    {
        item->setFlags(flags | Qt::ItemIsEditable);
    } 
}

Здесь 0 - индекс колонны, который вы хотите сделать readonly.

flags & (~Qt::ItemIsEditable)

Устанавливает детализируемую позицию до 0 независимо от предыдущего флага вашего товара.

flags | Qt::ItemIsEditable

Устанавливает его до 1 независимо от предыдущего флага.

Я новичок в Писиде и Питоне в целом, но я смог заработать это на работу, зарегистрировавшись с Qtreewidget для itemclicked обратных вызовов. В обратном вызове проверьте столбец и позвоните только «editiTeM», если это для столбца, которую вы хотите разрешить редактирование.

class Foo(QtGui.QMainWindow):
...
def itemClicked(self, item, column):
   if column > 0:
      self.qtree.editItem(item, column)

Не вызывая редактируемого для столбца 0, событие в основном отбрасывается.

Я обнаружил, что код ниже работает хорошо для моих потребностей и делает «keya», остановит пользователя от редактирования определенных частей столбцов:

Я в основном проверяю роль, а затем столбец. Я разрешаю редактирование только в столбце 0. Итак, если пользователь редактируют его в любой другой колонне, то я остановлю редактирование SetData, а изменение не производится.

void treeItemSubclassed::setData(int column, int role, const QVariant &value) {
    if (role == Qt::ItemIsEditable && column != 0){
        return;
    }
    QTreeWidgetItem::setData(column, role, value);
}

Установите дочернее виджет дерева Editable или нет (Itmes of tree), основанный на строке и столбце.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top