закрыть выпадающее меню qcombobox - PullRequest
0 голосов
/ 11 октября 2018

У меня проблема с QComboBox.Когда я нажимаю на него, открывается раскрывающееся меню.Хорошо до сих пор.Затем (через некоторое время) я добавляю заставку Image QFrame перед всем пользовательским интерфейсом (так же как и перед QComboBox), но выпадающее меню все еще видно (над QFrame моего изображения заставки).

Сначала Я попытался программно щелкнуть по другому объекту, чтобы выполнить закрытие выпадающего меню.Другой объект был нажат, но раскрывающееся меню не собиралось закрываться:

void GUI::click(QObject *obj)
{
    QMouseEvent evtPress(QEvent::MouseButtonPress, QPoint(0, 0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
    qApp->sendEvent(obj, &evtPress);
    QMouseEvent evtRelease(QEvent::MouseButtonRelease, QPoint(0, 0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
    qApp->sendEvent(obj, &evtRelease);
}

Подход second , о котором я думал, состоит в том, чтобы перечислить все QComboBoxes и закрытьраскрывающееся меню в цикле for или foreach.Но приложение довольно большое, и я не хочу этого делать по двум причинам:

  • Вручную собрать все QComboBoxes и закрыть меню: не поддерживает дальнейшие модификации.
  • Программно собрать все QComboBoxes и закрыть меню: я думаю, что это довольно медленно (и я не знаю, как это сделать).

1 Ответ

0 голосов
/ 11 октября 2018

Попробуйте отключить и снова включить de combobox.Если раскрывающийся список открыт, а затем поле со списком отключено, оно будет закрыто.

ui->comboBox->setEnabled(false);
ui->comboBox->setEnabled(true);

Вы можете получить каждого дочернего элемента, который является списком, в вашем пользовательском интерфейсе, используя метод findChildren и использоватьЦикл for для их закрытия:

QList<QComboBox*> children = ui->centralWidget->findChildren<QComboBox*>();

Вот небольшой пример использования таймера для его закрытия через 2 секунды:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QTimer>
#include <QList>
#include <QComboBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->comboBox->addItem("Test");
    ui->comboBox->addItem("Test2");
    ui->comboBox->addItem("Test3");
    ui->comboBox->addItem("Test4");
    ui->comboBox_2->addItem("Test5");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    ui->label->setText("The dropdown is open!");
    ui->comboBox->showPopup();
    ui->comboBox_2->showPopup();

    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, [this, timer]{

        //THIS    
        QList<QComboBox*> children = ui->centralWidget->findChildren<QComboBox*>();

        for (int i = 0; i < children.size(); i++) {
            children[i]->setEnabled(false);
            children[i]->setEnabled(true);
        }

        ui->label->setText("The dropdown has been closed!");
        timer->stop();
    });
    timer->start(2000); //time specified in ms*/
}

dropdown example

...