【问题标题】:How to hide action button when QLineEdit is disabled?禁用 QLineEdit 时如何隐藏操作按钮?
【发布时间】:2020-10-09 11:04:46
【问题描述】:

我有一个继承自 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 被禁用或只读。 我正在考虑为我的班级覆盖setDisabledsetReadOnly,并在其中为图标覆盖setVisible。但是这些函数不是虚拟的,所以不能被覆盖。 我也在考虑像我班的stateChanged 这样的信号,所以我可以在一个插槽中完成它。但我找不到任何类似QLineEdit 的信号。你知道怎么做吗?

【问题讨论】:

  • 你不能重写函数,但你仍然可以声明setDisabled(),并隐藏基类实现
  • @NgocMinhNguyen:非常感谢!我成功了。 :) 祝你有美好的一天!

标签: qt qlineedit readonly-attribute


【解决方案1】:

您可以通过覆盖QLineEdit::event 方法来处理事件QEvent::ReadOnlyChangeQEvent::EnabledChange

更新:

这是一个示例实现:

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);
}

【讨论】:

  • 您想详细说明如何做到这一点吗?
猜你喜欢
  • 1970-01-01
  • 2018-01-18
  • 2019-02-02
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2016-07-27
  • 2015-01-24
  • 1970-01-01
相关资源
最近更新 更多