我对QComboBox
有疑问。当我单击它时,它会打开下拉菜单。目前很好。然后(一段时间后),我在所有UI的前面(因此也在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
并关闭菜单:我认为这相当慢(而且我不知道该怎么做)。答案 0 :(得分:2)
尝试禁用和重新启用组合框。如果下拉列表处于打开状态,然后禁用了组合框,则下拉列表将关闭。
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*/
}