c++ - 关闭 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
方法是列出所有内容并在一个for
或foreach
循环中关闭下拉菜单。但是应用程序相当大,我真的不想这样做,原因有两个:
- 手动收集所有
QComboBoxes
和关闭菜单:不支持进一步修改。 - 以编程方式收集所有
QComboBoxes
菜单并关闭菜单:我认为相当慢(而且我不知道该怎么做)。
解决方案
尝试禁用和重新启用 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*/
}
推荐阅读
- html - REACT spa 应用程序 - 为 SEO 提供单独和不同的预渲染静态 html,优点和缺点
- java - 使用java流将标题和行的csv文件转换为hashmap数组
- bash - 如何在 unix 中为给定的字符串创建 kmer 模式?
- c# - 应用程序挂起:解释 WinDbg 命令的输出
- python - 继承和实例
- neo4j - Neo4j - 通过节点的最短路径
- android - Cordova - 如何在 android 中执行两次回调函数
- font-awesome - AMP 页面 - Fontawesome 图标未在移动设备上显示
- linux - 使用 mono 和 mono-fastcgi-server4 结合 NGINX 在 Linux 上运行 ASP.NET 应用程序
- sql-server - 在 ResultSet 中检索数据返回“”。SQL 服务器 + 安卓工作室