微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

禁用QLineEdit时如何隐藏动作按钮?

如何解决禁用QLineEdit时如何隐藏动作按钮?

我有一个继承自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被禁用或设为ReadOnly。 我正在考虑为我的班级覆盖setdisabledsetReadOnly,并为图标设置setVisible。但是这些功能不是虚拟的,因此不能被覆盖。 我也在考虑班上stateChanged之类的信号,因此可以在一个插槽中完成。但是我找不到QLineEdit这样的信号。你知道怎么做吗?

解决方法

您可以通过覆盖QEvent::ReadOnlyChange方法来处理事件QEvent::EnabledChangeQLineEdit::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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。