Курсор все еще появляется в LineEdit, хотя он больше не фокусируется

Мне нужно объединить LineEdit и Button вместе в такой элемент, и я хочу, чтобы lineEdit работал как обычно. Но когда я нажимаю на строку Edit, курсор не появляется, только когда я нажимаю 3 раза, то курсор появляется, но не мигает. введите описание изображения здесь

После этого я щелкаю в другом месте, чтобы потерять фокус для lineEdit, я надеюсь, что курсор больше не там, но тогда курсор все еще там.

введите описание изображения здесь

Я знаю, что проблема в моей таблице стилей, но я не могу узнать, где. Не могли бы вы, ребята, помочь мне?

Это мой код:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->lineEdit1->setPlaceholderText("another LineEdit to lose focus for the LineEdit below");
    QHBoxLayout *lineEditWithButtonForm = new QHBoxLayout( this );
    lineEditWithButtonForm->setSpacing(0);
    lineEditWithButtonForm->setContentsMargins(0,0,0,0);
    ui->m_lineEdit->setContentsMargins(10,0,10,0);
    ui->m_lineEdit->setFixedHeight( 25 );
    ui->m_lineEdit->setStyleSheet("QLineEdit{ padding-left: 10px; padding-right: 10px; border-width: 1px 0px 1px 1px; border-style: solid; border-color: rgb(204,204,204); }");
    lineEditWithButtonForm->addWidget(ui->m_lineEdit);
    ui->m_button->setFixedHeight( 25 );
    ui->m_button->setCursor( QCursor( Qt::PointingHandCursor ) );
    ui->m_button->setFocusPolicy(Qt::ClickFocus);
    ui->m_button->setStyleSheet( "QAbstractButton{ border-width: 1px 1px 1px 0px; border-style: solid; border-color: rgb(204,204,204); }");
    lineEditWithButtonForm->addWidget(ui->m_lineEdit);

    ui->m_lineEdit->installEventFilter( this );
}

bool MainWindow::eventFilter( QObject *obj, QEvent *event )
{
    if ( obj == ui->m_lineEdit )
    {
        if ( event->type() == QEvent::FocusIn )
        {
            ui->m_lineEdit->setStyleSheet( "QLineEdit{padding-left: 10px; padding-right: 10px; border-width: 1px 0px 1px 1px; border-style: solid; border-color:rgb(249,125,25)}" );
            ui->m_button->setStyleSheet( "QAbstractButton{ border-width: 1px 1px 1px 0px; border-style: solid; border-color: rgb(249,125,25)}" );
            return true;
        }
        else if ( event->type() == QEvent::FocusOut)
        {
            ui->m_lineEdit->setStyleSheet( "QLineEdit{ padding-left: 10px; padding-right: 10px; border-width: 1px 0px 1px 1px; border-style: solid; border-color: rgb(204,204,204)}" );
            ui->m_button->setStyleSheet( "QAbstractButton{ border-width: 1px 1px 1px 0px; border-style: solid; border-color: rgb(204,204,204) } ");
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return MainWindow::eventFilter( obj, event );
    }
 }

2 ответа

Решение

Когда вы вернете True в eventFilter() вы не позволяете виджету, в который должно было быть отправлено событие, не получить его, и в этом случае необходимо, чтобы FocusIn а также FocusOut событие получено QLineEdit, С учетом этого можно предложить следующее решение:

bool MainWindow::eventFilter( QObject *obj, QEvent *event )
{
    if ( obj == ui->m_lineEdit )
    {
        if ( event->type() == QEvent::FocusIn )
        {
            ui->m_lineEdit->setStyleSheet( "QLineEdit{padding-left: 10px; padding-right: 10px; border-width: 1px 0px 1px 1px; border-style: solid; border-color:rgb(249,125,25)}" );
            ui->m_button->setStyleSheet( "QAbstractButton{ border-width: 1px 1px 1px 0px; border-style: solid; border-color: rgb(249,125,25)}" );
        }
        else if ( event->type() == QEvent::FocusOut)
        {
            ui->m_lineEdit->setStyleSheet( "QLineEdit{ padding-left: 10px; padding-right: 10px; border-width: 1px 0px 1px 1px; border-style: solid; border-color: rgb(204,204,204)}" );
            ui->m_button->setStyleSheet( "QAbstractButton{ border-width: 1px 1px 1px 0px; border-style: solid; border-color: rgb(204,204,204) } ");
        }
    }
    return QMainWindow::eventFilter( obj, event );
}

FocusIn и FocusOut будет достаточно для события QLineEdit. Оставшиеся все события должны быть обработаны QMainWindow. Удалив возвращаемое ложное утверждение в другой части, можно решить проблему.

Другие вопросы по тегам