将对话框按钮连接到MainWindow插槽

时间:2019-09-25 21:01:24

标签: c++ qt qt5 c++14

我有一个Dialog窗口,应该能够将int中的QSpinBox和枚举列表ObjectType中的enum ObjectType {FASTBALL, ODDBALL, END}传递给MainWindow插槽。我已经使用{p>创建并打开了MainWindow的cosntructor中的对话框窗口。

MainWindow::MainWindow(ObjectController* controller, QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow), engine_(controller)
{

ui->setupUi(this);
Dialog dialog(this);
dialog.exec();

QGraphicsScene* scene = new QGraphicsScene;
view_ = new QGraphicsView(this);
view_->setScene(scene);
ui->gridLayout->addWidget(view_);
scene->setSceneRect(0, 0, VIEW_WIDTH, VIEW_HEIGHT);
connect(ui->startButton, &QPushButton::clicked,
        this, &MainWindow::startOrStop);
connect(ui->exitButton, &QPushButton::clicked,
        this, &MainWindow::close);
connect(&dialog, &Dialog::drawObjects,this,&MainWindow::spawnObjects);


// Set timer
timer_ = new QTimer(this);
connect(timer_, &QTimer::timeout,
        this, &MainWindow::moveObjects);

timer_->setInterval(CLOCK_MS);

}

Dialog : public Qdialog侧,我有一个QPushButton acceptButton_;连接到同一类中定义的accept插槽。该对话框还包含私有字段

int nOfObjectsToBeDisplayed_;
ObjectType objectType_;

和一个void drawObjects(int amount, ObjectType type);信号。 accept中的QDialog槽位重新定义如下:

void Dialog::accept()
{    
  emit drawObjects(nOfObjectsToBeDisplayed_, objectType_);
}

现在是令人讨厌的部分。在MainWindow端,我尝试通过{p>将Dialog的当前状态传递到插槽void spawnObjects(int count, ObjectType type);

connect(&dialog, SIGNAL(drawObjects(int, ObjectType)),this,SLOT(spawnObjects(int, ObjectType)));

但是,这无效。该插槽未调用,我知道,因为在其定义中有一条qDebug() << "Count: " << count << " Type: " << type;行,该行应将传递的对象数量和对象类型打印到控制台。

在这种情况下,即使MainWindow中的插槽似乎已连接,为什么也没有调用它?

1 个答案:

答案 0 :(得分:0)

好的,所以问题出在我将Dialog::drawObjects信号连接到MainWindow后的插槽中。 对话框显示为dialog.exec();。这本来应该很明显,但是在对话窗口已经在其自己的事件循环中启动之后,当然对话窗口将无法识别任何连接。