c++ - QT5 单选按钮信号与功能不兼容,即使它应该是

标签 c++ qt qt5 signals-slots qradiobutton

根据 QT5 文档,QRadioButton 继承了 4 signals来自 QAbstractButton,其中包括 clicked信号。它的模板是 clicked(boolchecked = false) 所以我很困惑为什么这段代码返回一个很长的错误消息,其中一部分是 error: static assertion failed: Signal and slot arguments不兼容

代码(简化,可能包含不属于原始代码的错误):

#include <QApplication>
#include <QMainWindow>
#include <QRadioButton>

#include <iostream>

class front_end : public QWidget
{
  Q_OBJECT

public:
  void load()
  {
    auto *rbtn_0 = new QRadioButton(tr("Reference"), this);
    rbtn_0->setChecked(true);

    QObject::connect(rbtn_0, &QRadioButton::clicked, this, SLOT(rbtn_toggle(bool)));
  }

public slots:
  void rbtn_toggle(bool arg_0)
  {
    std::cout << "Toggle\n";
  }
};

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  front_end FrontEnd;
  FrontEnd.load();

  return app.exec();
}

编译:

qmake -project -norecursive -Wall -Wparser -o main.pro;
echo "QT += widgets" >> main.pro;
echo "CONFIG += c++11" >> main.pro;

qmake -norecursive main.pro;
make;

错误消息:

g++ -c -m64 -pipe -O2 -std=c++0x -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o main.o main.cpp
main.cpp:21:8: warning: unused parameter ‘arg_0’ [-Wunused-parameter]
   void rbtn_toggle(bool arg_0)
        ^
In file included from /usr/include/qt5/QtCore/qcoreapplication.h:48:0,
                 from /usr/include/qt5/QtWidgets/qapplication.h:45,
                 from /usr/include/qt5/QtWidgets/QApplication:1,
                 from main.cpp:1:
/usr/include/qt5/QtCore/qobject.h: In instantiation of ‘static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const QObject*, Func2, Qt::ConnectionType) [with Func1 = void (QAbstractButton::*)(bool); Func2 = const char*; typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type = QMetaObject::Connection; typename QtPrivate::FunctionPointer<Func>::Object = QAbstractButton]’:
main.cpp:17:83:   required from here
/usr/include/qt5/QtCore/qobject.h:300:122: warning: overflow in implicit constant conversion [-Woverflow]
         const int FunctorArgumentCount = QtPrivate::ComputeFunctorArgumentCount<Func2 , typename SignalType::Arguments>::Value;
                                                                                                                          ^
In file included from /usr/include/qt5/QtCore/qcoreapplication.h:45:0,
                 from /usr/include/qt5/QtWidgets/qapplication.h:45,
                 from /usr/include/qt5/QtWidgets/QApplication:1,
                 from main.cpp:1:
/usr/include/qt5/QtCore/qglobal.h:669:47: error: static assertion failed: Signal and slot arguments are not compatible.
 #define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)
                                               ^
/usr/include/qt5/QtCore/qobject.h:302:9: note: in expansion of macro ‘Q_STATIC_ASSERT_X’
         Q_STATIC_ASSERT_X((FunctorArgumentCount >= 0),
         ^
In file included from /usr/include/qt5/QtCore/qobjectdefs.h:47:0,
                 from /usr/include/qt5/QtCore/qobject.h:48,
                 from /usr/include/qt5/QtCore/qcoreapplication.h:48,
                 from /usr/include/qt5/QtWidgets/qapplication.h:45,
                 from /usr/include/qt5/QtWidgets/QApplication:1,
                 from main.cpp:1:
/usr/include/qt5/QtCore/qobjectdefs_impl.h: In instantiation of ‘struct QtPrivate::FunctorReturnType<const char*, QtPrivate::List<> >’:
/usr/include/qt5/QtCore/qobject.h:305:158:   required from ‘static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const QObject*, Func2, Qt::ConnectionType) [with Func1 = void (QAbstractButton::*)(bool); Func2 = const char*; typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type = QMetaObject::Connection; typename QtPrivate::FunctionPointer<Func>::Object = QAbstractButton]’
main.cpp:17:83:   required from here
/usr/include/qt5/QtCore/qobjectdefs_impl.h:633:78: error: request for member ‘operator()’ in ‘QtPrivate::FunctorReturnType<Functor, QtPrivate::List<Tail ...> >::dummy<const char*>()’, which is of non-class type ‘const char*’
         typedef decltype(dummy<Functor>().operator()((dummy<ArgList>())...)) Value;

编辑:

是的,我知道将信号语法更改为 QT4 标准“SIGNAL(clicked(bool))”可以解决此问题,但我正在尝试摆脱该语法,更重要的是,了解问题。

最佳答案

您正在混合旧语法和新语法。每次通话选择一个来连接/断开连接。对于重载的信号/槽,您需要将函数指针转换为正确的类型,以防使用新语法

关于c++ - QT5 单选按钮信号与功能不兼容,即使它应该是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38818170/

相关文章:

C++ Builder - 即时生成 TThreads

c++ - 计算插入排序和归并排序的效率(daa)

c++ - 如何检查 LPTSTR 字符串的内容?

qt - 在插入之前查找 QWidget 的高度

c++ - 更改垂直标题标题

android - QWidget-based Android style preview in designer?

c++ - 重启后注册表项被删除

c++ - 尝试重载 << 运算符和使用友元函数时出错

c++ - QT Creator 链接器错误 : Link2019 File Not Found

c++ - 如何为 Windows 7 x64 构建 64 位 Qt 5.3?使用 MinGW-w64 和 MSVS 构建之间有什么区别吗?