代码之家  ›  专栏  ›  技术社区  ›  Andreas Brinck

仅使qtreeWidgetItem的一列可编辑

  •  25
  • Andreas Brinck  · 技术社区  · 14 年前

    我有一个 QTreeWidgetItem 对于两列数据,是否可以只编辑第二列?当我执行以下操作时:

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

    所有列都变为可编辑。

    10 回复  |  直到 7 年前
        1
  •  7
  •   Harald Scheirich    14 年前

    看来你得放弃使用了 QTreeWidget QTreeWidgetItem 一起去 QTreeView QAbstractItemModel . “widget”类是更抽象但更灵活版本的具体实现。 Qabstratem模型 有一个电话 flags(QModelIndex index) 您将返回列的适当值。

        2
  •  25
  •   d11    12 年前

    您只能使用变通方法使qtreeWidget中的某些列可编辑:

    1)将qtreeWidget的editTriggers属性设置为noeditTriggers

    2)在插入项时,设置qtreeWidgetItem对象的qt:itemieditable标志。

    3)将以下插槽连接到qtreeWidget对象的“itemDoubleClicked”信号:

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

    其中“is editable”是您编写的函数,对于可编辑列返回true,对于不可编辑列返回false。

        3
  •  18
  •   Olaf Schumann    14 年前

    我最近也遇到了同样的问题,发现了一个解决方案,它不仅适用于双击触发器(以及与双击信号的连接)。

    创建一个委托,该委托为编辑器返回一个空指针:

    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));
    
        4
  •  8
  •   Blaise    14 年前

    似乎标准qtreeWidget不允许这样做。我认为有两种方法可以做到这一点:

    1. 将qtreeview与从qabstratemModel派生的类一起使用,并重写flags函数

    2. 将qTreeView与qStandardItemModel一起使用。然后添加项目时,只需设置相应的列以允许编辑:

    下面是第二个选项的代码:

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

    我发现第二种方法更简单,但这取决于您的模型需要多大的灵活性。

        5
  •  6
  •   clark    11 年前

    我发现最简单的方法是使用qt::itemFlags

    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()

        6
  •  3
  •   cbuchart    8 年前
    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);
    }
    
        7
  •  1
  •   Kerry    14 年前

    我对pyside和python是个新手,但是我可以通过注册itemclicked回调的qtreewidget来实现这一点。在回调中,检查该列,仅当该列是要允许编辑的列时才调用“editem”。

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

    通过不调用列0的editem,事件基本上被丢弃。

        8
  •  1
  •   Dariusz    7 年前

    我发现下面的代码可以很好地满足我的需要,并且“有点”阻止了 编辑列的某些部分的用户:

    我基本上是检查角色,然后是专栏。我只允许在第0列中编辑。因此,如果用户在任何其他列中编辑它,那么我将停止setdata编辑,并且不会进行任何更改。

    void treeItemSubclassed::setData(int column, int role, const QVariant &value) {
        if (role == Qt::ItemIsEditable && column != 0){
            return;
        }
        QTreeWidgetItem::setData(column, role, value);
    }
    
        9
  •  1
  •   chraz    7 年前

    可能会晚一点,但可能有帮助:

    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是要使其成为只读的列的索引。

    flags & (~Qt::ItemIsEditable)
    

    将itemiseditable位置设置为0,而不考虑项的上一个标志。

    flags | Qt::ItemIsEditable
    

    无论上一个标志是什么,都将其设置为1。

        10
  •  0
  •   Naruto    14 年前

    根据行和列,将树小部件的子项设置为可编辑或不可编辑(树的ITMES)。