c++ - 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);
解决方案
这个:
SLOT(zoomBarAct(slider->value()))
没有意义。您需要指定插槽的名称:
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(zoomBarAct(int));
但是,您使用的是 Qt4 风格的信号/插槽连接。如果您切换到现代的 Qt5 风格的语法,这些错误将在编译时被捕获。改用它,这样更安全,并且保证永远不会产生这些类型的运行时错误,因为在编译期间会检查所有内容:
connect(slider, &QSlider::valueChanged, this, &MainWindow::zoomBarAct);
推荐阅读
- pca - 使用 PCA 进行特征选择的最佳方法(讨论)
- spring-boot - 招摇的标签对象中的动态值
- javascript - BootStrap DatePicker 日历输入更改不更新日历
- amazon-web-services - 在 S3 中存储字符串列表
- javascript - Javascript 自动化将附加工具添加到 Acrobat 中的工具栏
- python - 如何在数据库中保存链梯三角形
- python - 如何编写 QuerySet 语法让字段包含列表中的项目?
- json - Flutter 将 JSON 字符串转换为多级列表
- java - Xuggler 无法编码/转换 MPEG4 视频
- javascript - 如何从 getElementsByClassName 获取具有特定 ID 的元素?