【问题标题】:Qt - How can I make a particular Column of my QTableView as Non Editable?Qt - 如何使我的 QTableView 的特定列不可编辑?
【发布时间】:2012-09-18 22:23:22
【问题描述】:

我有一个QTableView,其中有 4 行和 4 列,每列代表他们的数据。默认情况下,QTableView 是可编辑的。现在我想在我的QTableView 中将任何特定列设为不可编辑。

我该怎么做?

提前致谢。

【问题讨论】:

    标签: c++ qt delegates qtableview qt4.7


    【解决方案1】:

    您可以使用setItemDelegateForColumn() 函数。实现一个只读委托,并将其设置为您需要的列。

    您还可以在模型中使用 the flags,并删除特定列的 Qt::ItemIsEditable 标志。

    【讨论】:

      【解决方案2】:

      在覆盖方法中,只需将其更改为if(!(index.column() == 0) 并将Flag 的值更改为Flag |= Qt::ItemisEditable
      这可以正常工作。

      【讨论】:

      • 我猜你的意思是覆盖bool QAbstractItemView::edit(const QModelIndex & index, EditTrigger trigger, QEvent * event) 不是吗?在这种情况下,您可以只为只读列返回false
      【解决方案3】:

      可能会这么晚,但供将来参考。您应该像这样将表格视图设置为NoEditTrigger

      myTableView->setModel(model);
      myTableView->setEditTriggers(QAbstractItemView::NoEditTriggers)
      

      【讨论】:

      • 哇,这是迄今为止我见过的最简洁的解决方案,特别是如果您只希望数据在同一模型的 一个 视图中为只读.谢谢!
      • 但是按照 OP 的要求,这种方法如何应用于单个列或行?
      【解决方案4】:

      类似的东西也可以做到:

      class NotEditableDelegate : public QItemDelegate
      {
          Q_OBJECT
      public:
          explicit NotEditableDelegate(QObject *parent = 0)
              : QItemDelegate(parent)
          {}
      
      protected:
          bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
          { return false; }
          QWidget* createEditor(QWidget *, const QStyleOptionViewItem &, const QModelIndex &) const
          { return Q_NULLPTR; }
      
      };
      

      使用中:

      // Make all the columns except the second read only
      for(int c = 0; c < view->model()->columnCount(); c++)
      {
          if(c != 1)
              view->setItemDelegateForColumn(c, new NotEditableDelegate(view));
      }
      

      【讨论】:

      • 在 editorEvent 中返回 true 而不是 false 将完全阻止 createEditor 被调用,因为它在该点使用事件。
      • @ricekab 我不确定这是不是真的:文档说“基本实现返回错误(表明它没有处理事件)。”根据一个实验,我只是为给定的index.colum() 返回 false 并没有停止编辑。
      【解决方案5】:

      最简单的方法是以这种方式设置您不想编辑的项目的标志:

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

      你也可以查看这个帖子:Qt How to make a column in QTableWidget read only

      【讨论】:

        【解决方案6】:

        您需要覆盖 'flags' 方法并为所选列指定元素的可编辑性参数

        Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
        {
            if(!index.isValid())
                return Qt::NoItemFlags;
            if(index.column() == SELECTED_COLUMN_NUM)
            {
                return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
            }
            return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
        }
        

        【讨论】:

          猜你喜欢
          • 2019-08-16
          • 1970-01-01
          • 1970-01-01
          • 2017-01-17
          • 2012-02-06
          • 1970-01-01
          • 2019-06-04
          • 2021-08-04
          • 1970-01-01
          相关资源
          最近更新 更多