Как открыть диалог после выбора QComboBox - PullRequest
0 голосов
/ 17 марта 2020

У меня есть QComboBox с несколькими вариантами выбора на QToolBar. Каждый выбор QComboBox открывает конкретное диалоговое окно c. У меня проблема в том, что после того, как я выбрал предпочтительный индекс в выпадающем списке, никаких диалогов не открывается. Для простоты примера я связываю один и тот же диалог со всеми вариантами:

dredgewindow.h

Это заголовочный файл

namespace Ui {
class DredgeWindow;
}

class DredgeWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit DredgeWindow(QWidget *parent = nullptr);
    ~DredgeWindow();

private:
    Ui::DredgeWindow *ui;
    DredgeDB *mDredgeDB;
};

dredgewindow. cpp

DredgeWindow::DredgeWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::DredgeWindow)
{
    ui->setupUi(this);

    QComboBox* myComboBox = new QComboBox;
    ui->toolBarControls->addWidget(myComboBox);
    myComboBox->addItem("Please Select");
    myComboBox->addItem("Bucket");
    myComboBox->addItem("Scow");
    myComboBox->addItem("Hopper Dredger");

    switch(myComboBox->currentIndex()){
      case 0:
        // do nothing
        break;
      case 1:
        // Go to Bucket
        mDredgeDB = new DredgeDB();
        mDredgeDB->show();
        break;
      case 2:
        // Go to Scow...
        mDredgeDB = new DredgeDB();
        mDredgeDB->show();
        break;
    case 3:
        // Go to Hopper Dredger
        mDredgeDB = new DredgeDB();
        mDredgeDB->show();
      default:
        break;
    }
}

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

До сих пор я пытался инициировать открытие диалогов с помощью комбинированного списка, но как только я отпускаю мышь (и, следовательно, я switch - case) Я ожидаю, что диалог откроется, но ничего не происходит. Этот источник был полезен, хотя его не было в c ++. Но все же я использовал его, чтобы понять общий подход.

Этот подход запускает комбинированный список и устанавливает его активным, но кроме этого нет указания c.

Заранее спасибо за указание правильного направления для решения этой проблемы.

1 Ответ

1 голос
/ 17 марта 2020

Вы должны подключить сигнал QComboBox :: activ () к некоторому слоту.

Сигналы и слоты в Qt5
Новый слот сигнала Синтаксис
qOverload <>

Этот сигнал отправляется, когда пользователь выбирает элемент в выпадающем списке. Индекс элемента передается. Обратите внимание, что этот сигнал отправляется, даже если выбор не изменился. Если вам нужно знать, когда выбор действительно меняется, используйте сигнал currentIndexChanged ().

Примечание: Активированный сигнал перегружен в этом классе. Чтобы подключиться к этому сигналу с помощью синтаксиса указателя функции, Qt предоставляет удобный помощник для получения указателя функции - qOverload <> .

class DredgeWindow : public QMainWindow
{
    Q_OBJECT
    ...
private slots:
    void on_combo_index_activated(int index);
    ...
};

DredgeWindow::DredgeWindow(QWidget *parent)
    : QMainWindow(parent)
{
    ...
    connect(myComboBox, QOverload<int>::of(&QComboBox::activated),
        [=](int index) { on_combo_index_activated(index); });
    ...
}

void DredgeWindow::on_combo_index_activated(int index)
{
    switch (index)
    {
    case 0:
        // do nothing
        break;

    case 1:
        // Go to Bucket
        mDredgeDB = new DredgeDB();
        mDredgeDB->show();
        break;

    case 2:
        // Go to Scow...
        mDredgeDB = new DredgeDB();
        mDredgeDB->show();
        break;

    case 3:
        // Go to Hopper Dredger
        mDredgeDB = new DredgeDB();
        mDredgeDB->show();

    default:
        break;
    }
}
...