首页 > 解决方案 > 关闭 qcombobox 的下拉菜单

问题描述

我有一个问题QComboBox。当我单击它时,它会打开下拉菜单。目前很好。然后(一段时间后)我QFrame在所有 UI 前面添加了一个屏幕保护程序图像(所以也在前面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);
}

我想到的第二个QComboBoxes方法是列出所有内容并在一个forforeach循环中关闭下拉菜单。但是应用程序相当大,我真的不想这样做,原因有两个:

标签: c++qtdropdownqcombobox

解决方案


尝试禁用和重新启用 de 组合框。如果下拉菜单打开,然后组合框被禁用,下拉菜单将关闭。

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

您可以使用findChildren方法获取 UI 中作为组合框的每个子项,并使用 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*/
}

下拉示例


推荐阅读