我有一个从 QLineEdit 继承的类,我为此设置了一个图标作为操作按钮。
MyEdit::MyEdit( QWidget *p_parent ) : QLineEdit( p_parent )
{
m_buttonAction = addAction( QIcon( "search.png" ), QLineEdit::TrailingPosition );
QAbstractButton *button = qobject_cast<QAbstractButton *>( m_buttonAction->associatedWidgets().last() );
m_buttonAction->setVisible( false );
connect( m_buttonAction, &QAction::triggered, this, &MyEdit::openCompleter );
m_completer = new QCompleter( this );
m_sourceModel = new CompleterSourceModel( m_completer );
m_view = new CompleterView();
m_view->setStyle( &m_style );
m_delegate = new CompleterDelegate( m_view );
m_completer->setPopup( m_view );
m_completer->setModel( m_sourceModel );
m_view->setItemDelegate( m_delegate );
setCompleter( m_completer );
}
void MyEdit::setDataForCompleter( const CompleterData &p_data )
{
m_sourceModel->setCompleterData( p_data );
m_buttonAction->setVisible( p_data.data().size() > 0 );
}
当我为完成者导入数据时,始终显示该图标。现在我需要隐藏此图标,以防
MyEdit
被禁用或为只读。
我正在考虑为我的班级覆盖 setDisabled
和 setReadOnly
,并在其中 setVisible
作为图标。但这些函数不是虚拟的,因此不能被覆盖。
我也在考虑像我班级的 stateChanged
这样的信号,这样我就可以在一个插槽中完成它。但我找不到任何类似的信号QLineEdit
。你知道该怎么做吗?
您可以通过重写
QEvent::ReadOnlyChange
方法来处理事件 QEvent::EnabledChange
或 QLineEdit::event
。
这是一个示例实现:
bool MyEdit::event(QEvent *e) override {
const auto type = e->type();
if (type == QEvent::ReadOnlyChange || type == QEvent::EnabledChange) {
m_buttonAction->setVisible(m_sourceModel->rowCount() > 0 ? isEnabled() && isReadOnly() : false);
}
return QLineEdit::event(e);
}