Курсор все еще появляется в 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. Удалив возвращаемое ложное утверждение в другой части, можно решить проблему.