Qt——Qt connect问题

复制代码
/usr/include/x86_64-linux-gnu/qt5/QtCore/qobject.h:328:9: error: static assertion failed: Signal and slot arguments are not compatible.
  328 |         Q_STATIC_ASSERT_X((FunctorArgumentCount >= 0),
      |         ^~~~~~~~~~~~~~~~~
/usr/include/x86_64-linux-gnu/qt5/QtCore/qobject.h:328:9: note: the comparison reduces to '(-1 >= 0)'

这个错误是由于在`connect`函数中的lambda表达式修改了一个以非`const`引用方式传递的参数,而该参数本应当是不可修改的。在`currentTextChanged`信号发出时,它提供的是一个`const QString &`参数,意味着不能修改传入的字符串。

错误的根源在于`QString& value`应该是`const QString& value`,因为信号传递的字符串不应被更改。此外,这里尝试两次修改并使用`value`,这在逻辑上也是有问题的,因为第一次`remove`调用已经改变了`value`。如果需要改变值,应该使用一个临时变量来存储修改后的结果。

以下是修正后的代码示例:

cpp 复制代码
connect(year, &RComboBox::currentTextChanged,
        [this](const QString& value) {
    // 创建一个副本来修改
    QString digitsOnly = value;
    digitsOnly.remove(QRegularExpression("[^0-9]"));

    // 使用修改后的副本更新数据
    this->test->setDate(digitsOnly,this->test->test1(),
                                     this->test->test2());
});
cpp 复制代码
/usr/include/x86_64-linux-gnu/qt5/QtCore/qobject.h:322:13: 
error: no type named 'type' in 'struct std::enable_if<false, QMetaObject::Connection>'

这个错误提示通常表明在使用 Qt 的信号和槽机制时,发生了类型不匹配的问题。这种错误一般有几个可能的原因,我将一一列举并提供解决方案:

1.信号和槽的参数不匹配:

  • 确保connect中的信号的参数类型与槽的参数类型完全匹配。例如,如果槽函数需要一个参数,而信号没有提供参数,或者提供的参数类型不匹配,则会发生这个错误。

  • 检查并确保信号和槽的参数完全一致,包括数量和类型。

  1. 拼写错误或不正确的方法签名:
  • 确保方法名称和参数列表的拼写是正确的。在Qt中,信号和槽的名称、参数类型必须精确匹配。
cpp 复制代码
.cpp:54: error: no matching function for call to 'test::connect(QSharedPointer<test2>&, void (test2::*)(), test*, void (test::*)())'
.cpp: In member function 'void test::initConnect()':
.cpp:54:12: error: no matching function for call to 'test::connect(QSharedPointer<test2>&, void (test2::*)(), test*, void (test::*)())'
   54 |     connect(test2, &test2::timeChange,
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   55 |             this, &test::draw);
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

从错误信息来看,问题出现在尝试使用`QSharedPointer`对象连接信号和槽。在Qt中,当使用智能指针,如`QSharedPointer`管理对象时,不能直接在`connect`函数中使用这些智能指针。`connect`函数需要直接访问对象本身,而不是智能指针。

解决方法

您需要使用`QSharedPointer::data`方法或`*`运算符来获取指向管理对象的指针,并将其用于连接信号和槽。以下是修改后的代码示例,展示如何正确使用`QSharedPointer`进行连接:

  • `data()`:这个方法返回存储在`QSharedPointer<DataInteraction>`中的`DataInteraction`对象的原始指针。

  • `通过解引用智能指针,同样可以获得指向对象的原始指针。

相关推荐
秦禹辰14 分钟前
宝塔面板安装MySQL数据库并通过内网穿透工具实现公网远程访问
开发语言·后端·golang
黄焖鸡能干四碗20 分钟前
智慧教育,智慧校园,智慧安防学校建设解决方案(PPT+WORD)
java·大数据·开发语言·数据库·人工智能
一只乔哇噻1 小时前
java后端工程师进修ing(研一版 || day41)
java·开发语言·学习·算法
钮钴禄·爱因斯晨1 小时前
深入剖析LLM:从原理到应用与挑战
开发语言·人工智能
六点半8881 小时前
【C++】C++11 篇二
开发语言·c++
DDDDDDDRDDR1 小时前
C++容器:list
开发语言·c++·stl
Elnaij1 小时前
从C++开始的编程生活(7)——取地址运算符重载、类型转换、static成员和友元
开发语言·c++
chen_ever2 小时前
golang之go modules
开发语言·后端·golang
郝学胜-神的一滴2 小时前
Effective Modern C++ 条款26:避免在通用引用上重载
开发语言·c++·程序人生
草莓熊Lotso2 小时前
【C++】递归与迭代:两种编程范式的对比与实践
c语言·开发语言·c++·经验分享·笔记·其他