Nano Hash - криптовалюты, майнинг, программирование

закрыть раскрывающийся список qcombobox

У меня проблема с QComboBox. Когда я нажимаю на него, он открывает выпадающее меню. До сих пор хорошо. Затем (через некоторое время) я добавляю изображение заставки 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);
}

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

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

Ответы:


1

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

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*/
}

пример раскрывающегося списка

11.10.2018
  • Итак, как мне программно получить все QComboBoxes из моего пользовательского интерфейса? Это возможно? 11.10.2018
  • Я не уверен, в чем проблема. Как вы сказали в своем вопросе, способ сделать это - сохранить их в списке и использовать для закрытия цикла, как я показал. Это не повлияет на производительность, это действительно небольшая операция, даже повторение ее несколько раз. Вы также можете создать метод, который включает/отключает каждое поле со списком вашего пользовательского интерфейса одно за другим, без цикла for (как я сделал в своем простом примере). 11.10.2018
  • Ваш ответ хорош. Но мне нужен список ui qcomboboxes, и этот список будет довольно большим. Я имею в виду большой. Shure, если бы у меня не было другого выбора, я бы сделал это с помощью списка, созданного вручную, но я боюсь этого делать. 11.10.2018
  • @Michael1248 Michael1248 проверьте мой обновленный ответ, чтобы узнать, соответствует ли он вашим потребностям. 11.10.2018
  • Это решение намного лучше. Большое спасибо. 11.10.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..