【发布时间】:2019-09-25 21:01:24
【问题描述】:
我有一个Dialog 窗口,它应该能够将来自QSpinBox 的int 和来自枚举列表enum ObjectType {FASTBALL, ODDBALL, END} 的ObjectType 传递给MainWindow 插槽。我已经在 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); 信号。
来自QDialog 的accept 插槽重新定义如下:
void Dialog::accept()
{
emit drawObjects(nOfObjectsToBeDisplayed_, objectType_);
}
现在是烦人的部分。在MainWindow 方面,我正在尝试将Dialog 的当前状态传递给插槽void spawnObjects(int count, ObjectType type);
connect(&dialog, SIGNAL(drawObjects(int, ObjectType)),this,SLOT(spawnObjects(int, ObjectType)));
但是,这没有任何效果。插槽没有被调用,我知道这是因为在它的定义中有一个 qDebug() << "Count: " << count << " Type: " << type; 行,应该将传递的对象数量和对象类型打印到控制台。
为什么MainWindow 中的插槽在这种情况下没有被调用,即使它似乎已连接到它?
【问题讨论】:
-
尝试使用:
connect(&dialog, &Dialog::drawObjects, this, &Other_Class::spawnObjects);并提供 MRE -
给信号起被动名称来描述它们所发出的信号是个好主意。插槽(以及任何真正的非信号功能)然后以主动语态描述它们这样做。使
connects 更具可读性。