首页 > 解决方案 > C++/Qt 项目的连接函数中不存在插槽?(已经重新制作)

问题描述

我正在向 easyPaint 添加一个滑块,它将启用缩放功能。我让滑块出现在屏幕上我想要的位置,我为它构建的函数应该没有任何问题,但是当我运行它时,我得到一个运行时错误,即插槽不存在,当它明显存在时. 我已经尝试过清理解决方案、重新运行 CMake 并重新构建,但每次仍然出现“插槽不存在”错误。其他人能想到我会遇到这个问题的任何其他原因吗?

这是主窗口类中带有滑块的扩展坞的设置:

dock = new QDockWidget(tr("Zoom"));
slider = new QSlider(dock);
addDockWidget(Qt::BottomDockWidgetArea, dock);
dock->setWidget(slider);
dock->setFeatures(QDockWidget::NoDockWidgetFeatures);
slider->setOrientation(Qt::Horizontal);
slider->setMinimum(0);
slider->setMaximum(16);
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(zoomBarAct(slider->value())));

这是我在头文件的私有插槽部分中声明的缩放功能:

void MainWindow::zoomBarAct(int zoom)
{
    float factor = static_cast<float>(zoom) / 4;
    getCurrentImageArea()->zoomImage(factor);
    getCurrentImageArea()->setZoomFactor(factor);
}

编辑函数声明(省略私有槽后的其他函数):

private slots:
     void zoomBarAct(int zoom);

标签: c++qt

解决方案


这个:

SLOT(zoomBarAct(slider->value()))

没有意义。您需要指定插槽的名称:

connect(slider, SIGNAL(valueChanged(int)), this, SLOT(zoomBarAct(int));

但是,您使用的是 Qt4 风格的信号/插槽连接。如果您切换到现代的 Qt5 风格的语法,这些错误将在编译时被捕获。改用它,这样更安全,并且保证永远不会产生这些类型的运行时错误,因为在编译期间会检查所有内容:

connect(slider, &QSlider::valueChanged, this, &MainWindow::zoomBarAct);

推荐阅读