【问题标题】:enum values in a class - Qt Creator类中的枚举值 - Qt Creator
【发布时间】:2015-02-10 14:14:25
【问题描述】:

我创建了一个包含枚举值的函数类,但是在我的 main.cpp 中调用时,我收到“尚未声明”错误。我试图弄清楚我哪里出错了,但运气不好。我的班级标题,目前(减少到适合此处):

class main_funcs : public QObject
{
    Q_OBJECT
public:
main_funcs(QObject *parent, QQuickView *view)
    : QObject(parent), myDialog(view){

    IP_is_set = false;
    newIP = null;
    newIP.resize(50);
    local_IPv4 = null;

    enum direction {up, down};
    enum sys_sides {left, right};
    enum sys_control {analog, digital};
public slots:
    void myfunc1();
    void myfunc2(sys_sides side);
    void myfunc3(direction dir);
    void myfunc4(sys_control type);
private:
    ...
    ...
}

在我的 main.cpp 中,我将信号连接到插槽:

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

    // MAIN CONTROL WINDOW:
    QQuickView* view = new QQuickView(QUrl("main.qml")); 
    view->show();
    QQuickItem *rect = view->rootObject();
    main_funcs *funcs = new main_funcs(0, view);

    QObject::connect(rect, SIGNAL(onClicked_func1()), funcs, SLOT(myfunc1()));
    QObject::connect(rect, SIGNAL(onClicked_func2()), funcs, SLOT(myfunc2(funcs::up)));
    QObject::connect(rect, SIGNAL(onClicked_func3()), funcs, SLOT(myfunc3(funcs::left)));
    QObject::connect(rect, SIGNAL(onClicked_func4()), funcs, SLOT(myfunc4(funcs::analog)));

错误出现在需要枚举值的函数的类头中。错误是枚举值“尚未声明” - 它在其上方的公共标题中声明。我仍然是一个 C/C++ 新手,而且对 Qt 来说绝对是新手,因为我没有做太多。至少有人能指出我正确的方向吗?谢谢!

【问题讨论】:

  • 正如两个答案所指出的,您不能将枚举值放入信号/插槽声明中。但是,您可以放置​​枚举类型。您可以使用 Q_ENUM 宏将枚举公开给 qml。这应该可以简化您的问题。
  • 您的代码中有一些奇怪的地方,我看不到您的构造函数 main_funcs 的右大括号。如果真实文件中的右括号正好在“公共插槽”之前:那么这是你的枚举不起作用的方式,这是因为它们是你的构造函数的本地
  • @FélixCantournet 你也可以使用 lambda ......但这通常意味着你没有正确规划你的信号。
  • @Marco - 只是这篇文章中的一个错字,右括号出现在我关闭 main_funcs(QObject *parent... 构造函数的代码中。我会尝试再次移动枚举值。

标签: c++ qt enums


【解决方案1】:

您给enums 的电话是错误的。它们的范围是类,而不是类对象。

试试这个:

QObject::connect(rect, SIGNAL(onClicked_func2()), funcs, SLOT(myfunc2(main_funcs::up)));
QObject::connect(rect, SIGNAL(onClicked_func3()), funcs, SLOT(myfunc3(main_funcs::left)));
QObject::connect(rect, SIGNAL(onClicked_func4()), funcs, SLOT(myfunc4(main_funcs::analog)));

编辑: 这将解决“尚未声明”错误,但我意识到你会得到另一个错误。您正在尝试将参数传递给函数指针,这是行不通的。

信号将接受一个参数,您传入的参数将通过 Qt 传递到您的插槽。 您无法控制连接中插槽的参数。您可以通过传递给信号的内容来控制对插槽的参数。

阅读此文了解更多信息:http://doc.qt.io/qt-5/signalsandslots.html

【讨论】:

  • 谢谢 - 我想我找到了我的问题 - 正如你和@Marco 指出的那样,我的枚举语句在类对象中的位置错误。我将它们移到 QObject 构造函数之外,并将它们放在公共标题下,到目前为止所有内容都已编译。我将在今天晚些时候进行测试以确保它们运行。再次感谢!
  • @JediEngineer 别忘了查看connect 电话。如果您对此有更多问题,您可能应该打开一个新问题,但是如果您在此处发布链接,我会来看看。
  • @JediEngineer 我那里的代码有一个错误,SLOTs 不是实际函数,因为它们中有参数。如果您插入此代码,我确实希望它能够工作。
  • 你是说包含带参数的函数的槽在Qt中不起作用?
  • @JediEngineer 是的,这就是我要说的。 Qt states: "注意信号和槽参数不能包含任何变量名,只能包含type。"
【解决方案2】:

您的代码存在一些重大问题。连接信号和插槽时不应定义值。只有类型应该以旧式连接语法提供。

当将信号连接到某个插槽时,该信号应该为插槽提供参数。所以在这里你可以不将任何信号onClicked_func2,.. 连接到插槽,因为它们显然没有任何参数。 (万一onClicked_func2真的是一个信号,它看起来像一个槽)

另外,如果你想使用枚举类型,你应该在类范围内使用枚举,遵循类名:

main_funcs::up

【讨论】:

    【解决方案3】:

    首先,我建议将构造函数定义放在 cpp 文件中,而不是放在类定义文件中,这将有助于保持整洁,并且不要忘记在这种情况下关闭构造函数的大括号。

    其次,我还建议将您的枚举保留在类定义之外,这样您就可以在其他类中使用它们,因为它们似乎是非常通用的逻辑枚举。

    第三个信号和槽不能那样工作,你需要用相同的槽签名连接信号签名,你不能在连接期间传递实际参数我做的事情永远不会起作用,你也应该得到很多连接启动过程中的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多