Поведение курсора непоследовательно после выбора элемента в QComboBox с использованием разных методов.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Поведение курсора непоследовательно после выбора элемента в QComboBox с использованием разных методов.

Сообщение Anonymous »

Я настроил диалоговое окно, содержащее элемент управления QComboBox m_box и элемент управления QListWidget m_lst. m_box поддерживает сопоставление результатов поиска. Если элемент из раскрывающегося списка m_box выбран прямым щелчком мыши, курсор не будет отображаться в m_box, как показано в примере ниже.
Изображение

Если элемент из m_box выбирается методом сопоставления поиска с помощью клавиш вверх и вниз и клавиши Enter, курсор также не будет отображаться в m_box, как показано в примере ниже.
Изображение

Однако, если совпадающие элементы отображаются через при совпадении поиска и выборе элемента из раскрывающегося списка с помощью мыши курсор будет отображаться в m_box, как показано в примере ниже.
Изображение

Я надеюсь на единообразное поведение всех трех методов: до тех пор, пока выбранный элемент существует в элементах-кандидатах m_box, курсор не должен отображаться в m_box, если только не щелкнуть мышью по m_box, после чего курсор должен появиться. Вот минимальный воспроизводимый пример:
#include
#include
#include
#include
#include
#include
#include
#include

class CustomDialog : public QDialog
{
Q_OBJECT
public:
CustomDialog(QWidget* parent = nullptr) : QDialog(parent)
{
QStringList items;
items addItems(items);
QCompleter* completer = new QCompleter(items, m_box);
completer->setFilterMode(Qt::MatchContains);
m_box->setCompleter(completer);

m_lst = new QListWidget(this);
m_lst->addItems(items);

QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(m_box);
layout->addWidget(m_lst);

connect(m_box, SIGNAL(activated(int)), this, SLOT(onSelChangedBox(int)));
}

public slots:
void onSelChangedBox(int iSel);

private:
QComboBox* m_box;
QListWidget* m_lst;
};

void CustomDialog::onSelChangedBox(int iSel)
{
qDebug() setFocus();
}

int main(int argc, char* argv[])
{
QApplication a(argc, argv);

CustomDialog dlg;
dlg.setFixedSize(300, 200);
dlg.show();

return a.exec();
}

#include "main.moc"

Примечание. Если добавлен второй QComboBox и элемент выбран с использованием третьего метода, то щелчок по второму QComboBox приведет к появлению двух курсоров. Фактически, в этот момент фокус больше не находится на первом QComboBox, но курсор все еще отображается. Код и пример следующие:
Изображение

#include
#include
#include
#include
#include
#include
#include
#include

class CustomDialog : public QDialog
{
Q_OBJECT
public:
CustomDialog(QWidget* parent = nullptr) : QDialog(parent)
{
QStringList items;
items addItems(items);
QCompleter* completer1 = new QCompleter(items, m_box1);
completer1->setFilterMode(Qt::MatchContains);
m_box1->setCompleter(completer1);

m_box2 = new QComboBox(this);
m_box2->setEditable(true);
m_box2->addItems(items);
QCompleter* completer2 = new QCompleter(items, m_box2);
completer2->setFilterMode(Qt::MatchContains);
m_box2->setCompleter(completer2);

m_lst = new QListWidget(this);
m_lst->addItems(items);

QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(m_box1);
layout->addWidget(m_box2);
layout->addWidget(m_lst);

connect(m_box1, SIGNAL(activated(int)), this, SLOT(onSelChangedBox(int)));
connect(m_box2, SIGNAL(activated(int)), this, SLOT(onSelChangedBox(int)));
}

public slots:
void onSelChangedBox(int iSel);

private:
QComboBox* m_box1;
QComboBox* m_box2;
QListWidget* m_lst;
};

void CustomDialog::onSelChangedBox(int iSel)
{
qDebug() setFocus();
}

int main(int argc, char* argv[])
{
QApplication a(argc, argv);

CustomDialog dlg;
dlg.setFixedSize(500, 500);
dlg.show();

return a.exec();
}

#include "main.moc"


Подробнее здесь: https://stackoverflow.com/questions/790 ... ox-using-d
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»