有没有办法确定QTableView
当前单元格中是否有一个打开的编辑器?我需要处理以下情况:
我看到如何获取当前项目,并且可以获得该项目的委托,但我没有看到任何我希望找到的isEditMode()
属性。
有人能指出我正确的方向吗?
答案 0 :(得分:7)
只需检查是否返回
State QAbstractItemView::state () const
是
QTableView::EditingState
答案 1 :(得分:3)
连接底层模型dataChanged信号
void QAbstractItemModel::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight )
您可以检查数据已更改的单元格是否与currentIndex
相同QModelIndex QAbstractItemView::currentIndex () const
您无法知道当前单元格是否具有直接打开的编辑器,但可以检查该视图是否在QAbstractItemView :: EditingState
中State QAbstractItemView::state () const
做你想做的事就足够了。
答案 2 :(得分:3)
您可以创建QTableView
的子类,以便能够访问state()
函数,该函数很遗憾受到保护。但是,我没有尝试过。
如果您已经拥有QStyledItemDelegate
子类,则可以使用它来跟踪编辑器当前是否处于打开状态。但是,您不能只使用setEditorData
/ setModelData
,因为当用户取消编辑时,系统不会调用setModelData
。相反,您可以跟踪编辑器本身的创建和销毁。
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
的指针并使用它。
答案 3 :(得分:2)
对您的委托进行子类化,使其包含一个访问者,告诉您何时编辑它:
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
,您可以发出信号,以便了解代表所处的状态。
答案 4 :(得分:1)
如果您知道正在编辑的项目的索引,则可以调用indexWidget()
并尝试投射它。如果它有效,您不仅知道自己正在编辑,还可以方便地使用编辑器小部件。
EditWidget *editWidget = qobject_cast<EditWidget*>(tableView->indexWidget(tableView->currentIndex()));
if(editWidget)
{
//yep, ur editing bro
}
答案 5 :(得分:0)
这是一个想法,它甚至有助于在编辑开始之前获取编辑/组合小部件...
只是发出一个信号并在主窗口中消耗它......这就是我在编辑之前使用QTableWidget获取组合框的内容......
首先在ComoBoxItemDelegate中创建一个信号......
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;
}
并在MainWindow中声明一个函数来接收信号......
void MainWindow::OnComboEidt(QComboBox *pCB) const
{
qDebug() << "Combo Eidt Singal Received";
}
然后最后在MainWindow的构造函数中连接它......
ComboBoxItemDelegate* cbid = new ComboBoxItemDelegate(ui->tableWidget);
connect(cbid, &ComboBoxItemDelegate::OnComboEdit, this, &MainWindow::OnComboEidt);
ui->tableWidget->setItemDelegateForColumn(0, cbid);