代码之家  ›  专栏  ›  技术社区  ›  Dave Mateer

确定qTableView是否具有打开的编辑器

  •  9
  • Dave Mateer  · 技术社区  · 15 年前

    有没有办法确定 QTableView 当前单元格中是否有打开的编辑器?我需要处理以下情况:

    • 用户双击单元格并编辑数据,但是 使单元格保持“编辑”状态 .
    • 在UI的另一部分上,将执行更改基础模型的选定行的操作。
    • 回到我的视图,我想确定新选择的行是否与打开的行相同。如果没有,我需要采取行动。(提示用户?自动提交?回复?)

    我知道如何获取当前项目,并且可以获取该项目的委托,但我看不到任何 isEditMode() 我希望能找到的财产。

    有人能给我指个方向吗?

    6 回复  |  直到 8 年前
        1
  •  2
  •   Kaleb Pederson    15 年前

    对委托进行子类化,使其包含一个访问器,用于通知您何时进行编辑:

    void MyDelegate::setEditorData ( QWidget * editor, const QModelIndex & index ) const {
        // _isEditing  will have to be mutable because this method is const
        _isEditing = true; 
        QStyledItemDelegate::setEditorData(editor, index);
    }
    
    void MyDelegate::setModelData ( QWidget * editor, QAbstractItemModel * model, const QModelIndex & index ) const {
        QStyledItemDelegate::setModelData(editor, model, index);
        _isEditing = false;
    }
    
    bool MyDelegate::isEditing() const { return _isEditing; }
    

    然后你可以检查一下代表,看看发生了什么。或者,如果您不喜欢 mutable ,可以发出信号,以便知道委托处于什么状态。

        2
  •  7
  •   wedesoft    11 年前

    只需检查

    State QAbstractItemView::state () const
    

    QTableView::EditingState
    
        3
  •  3
  •   trompa    12 年前

    连接到基础模型数据更改信号

    void QAbstractItemModel::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight )
    

    您可以检查更改数据的单元格是否与当前索引相同

    QModelIndex QAbstractItemView::currentIndex () const
    

    您不知道当前单元格是否有直接打开的编辑器,但可以检查该视图是否在QabstratemView::EditingState中。

    State QAbstractItemView::state () const
    

    做你想做的就足够了。

        4
  •  3
  •   Florian Kusche    11 年前

    您可以子类 QTableView 为了能够访问 state() 功能,但很遗憾受到保护。但是,我没有尝试过。

    如果你已经有了 QStyledItemDelegate 子类,可以使用它跟踪编辑器当前是否打开。但是,你不能只使用 setEditorData / setModelData ,因为 SET模型数据 当用户取消编辑时不会被调用。相反,您可以跟踪编辑器本身的创建和销毁。

    class MyItemDelegate : public QStyledItemDelegate
    {
        Q_OBJECT
    
    public:
        MyItemDelegate( QObject* parent = nullptr );
        ~MyItemDelegate();
    
        QWidget* createEditor( QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index ) const;
        void setEditorData( QWidget* editor, const QModelIndex& index ) const;
        void setModelData( QWidget* editor, QAbstractItemModel* model, const QModelIndex& index ) const;
    
        bool isEditorOpen() const   { return *m_editorCount > 0; }
    
    protected:
        int* m_editorCount;
    
    protected slots:
        void onEditorDestroyed( QObject* obj );
    };
    

    实施:

    MyItemDelegate::MyItemDelegate( QObject* parent ) :
        QStyledItemDelegate( parent )
    {
        m_editorCount = new int;
        *m_editorCount = 0;
    }
    
    MyItemDelegate::~MyItemDelegate()
    {
        delete m_editorCount;
    }
    
    QWidget* MyItemDelegate::createEditor( QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index ) const
    {
        // create an editor, can be changed as needed
        QWidget* editor = QStyledItemDelegate::createEditor( parent, option, index );
    
        connect( editor, SIGNAL(destroyed(QObject*)), SLOT(onEditorDestroyed(QObject*)));
        printf( "editor %p created\n", (void*) editor );
        (*m_editorCount)++;
    
        return editor;
    }
    
    void MyItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
    {
        ...
    }
    
    void MyItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    {
        ...
    }
    
    void MyItemDelegate::onEditorDestroyed( QObject* obj )
    {
        printf( "editor %p destroyed\n", (void*) obj );
        (*m_editorCount)--;
    }
    

    在某些情况下,例如,当使用光标键移动到树中的下一个项目时,qt将首先创建新的编辑器,然后销毁旧的编辑器。因此, m_editorCount 必须是整数而不是bool。

    不幸的是, createEditor() 是一个 const 功能。因此,不能创建 int -成员。相反,创建指向 int 然后用这个。

        5
  •  1
  •   mrg95    8 年前

    如果知道正在编辑的项的索引,可以调用 indexWidget() 试着铸造它。如果它是有效的,那么您不仅知道您正在编辑,而且您还可以方便地使用编辑器小部件。

    EditWidget *editWidget = qobject_cast<EditWidget*>(tableView->indexWidget(tableView->currentIndex()));
    if(editWidget)
    {
        //yep, ur editing bro
    }
    
        6
  •  0
  •   Ooty    8 年前

    这里有一个想法,它甚至有助于在编辑开始之前获得编辑/组合小部件…

    只需发出一个信号并在主窗口中使用它…这是我在编辑前用它在qtablewidget中获取组合框的方法…

    首先在ComboxItemDelegate中创建一个信号…

    signals:
       void OnComboEdit(QComboBox* pCombo) const;
    

    然后在CreateEditor方法中发出信号…

    QWidget* ComboBoxItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
    {
        // Create the combobox and populate it
        QComboBox* cb = new QComboBox(parent);
        emit OnComboEdit(cb);
        return cb;
    }
    

    在主窗口中声明一个函数来接收信号…

    void MainWindow::OnComboEidt(QComboBox *pCB) const
    {
        qDebug() << "Combo Eidt Singal Received";
    }
    

    最后在主窗口的构造函数中连接它…

    ComboBoxItemDelegate* cbid = new ComboBoxItemDelegate(ui->tableWidget);
    connect(cbid, &ComboBoxItemDelegate::OnComboEdit, this, &MainWindow::OnComboEidt);
    ui->tableWidget->setItemDelegateForColumn(0, cbid);
    
    推荐文章