C++ 如何在选择QComboBox后打开对话框

C++ 如何在选择QComboBox后打开对话框,c++,c++11,qt5,qcombobox,C++,C++11,Qt5,Qcombobox,我有一个QComboBox,在QToolBar上有几个选项。每次选择QComboBox都会打开一个特定的对话框窗口。 我的问题是,在组合框上选择首选索引后,没有对话框打开。为简化示例,我将同一对话框链接到所有选项: window.h 这是头文件 namespace Ui { class DredgeWindow; } class DredgeWindow : public QMainWindow { Q_OBJECT public: explicit DredgeWindow

我有一个
QComboBox
,在
QToolBar
上有几个选项。每次选择
QComboBox
都会打开一个特定的对话框窗口。 我的问题是,在组合框上选择首选索引后,没有对话框打开。为简化示例,我将同一对话框链接到所有选项:

window.h

这是头文件

namespace Ui {
class DredgeWindow;
}

class DredgeWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::DredgeWindow *ui;
    DredgeDB *mDredgeDB;
};
疏浚窗口.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;
}
到目前为止,我一直在尝试使用组合框触发对话框的打开,但是一旦我释放鼠标(因此我
切换
-
案例
),我希望对话框会打开,但什么也没有发生。即使不是C++,也是有用的。但我还是用它来理解一般的方法

触发组合框并将其设置为活动状态,但除此之外,没有特定指示

提前感谢您为解决此问题指明了正确的方向

您必须将信号连接到某个插槽



当用户选择组合框中的项目时,将发送此信号。这个 已传递项的索引。请注意,即使在 选择没有改变。如果你想知道什么时候该选择 更改,请使用信号currentIndexChanged()

注意:激活的信号在此类中过载。连接到这个 通过使用函数指针的信号语法,Qt提供了一个方便的 获取函数指针的助手-qOverload

类窗口:公共QMainWindow { Q_对象 ... 专用插槽: 组合索引无效(整数索引); ... }; 疏通窗口::疏通窗口(QWidget*父) :QMainWindow(父级) { ... 连接(myComboBox、QOverload::of(&QComboBox::已激活), [=](int-index){on_-combo_-index_-activated(index);}); ... } 无效窗口::在组合索引中激活(整数索引) { 开关(索引) { 案例0: //无所事事 打破 案例1: //去死吧 mDredgeDB=new-db(); mDredgeDB->show(); 打破 案例2: //去划船。。。 mDredgeDB=new-db(); mDredgeDB->show(); 打破 案例3: //去挖泥船 mDredgeDB=new-db(); mDredgeDB->show(); 违约: 打破 } }
完美的工作方式!感谢您指出新的
connect
notation!:)
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;
    }
}