class 中的枚举值 - Qt Creator

enum values in a class - Qt Creator

我创建了一个包含枚举值的函数 class,但在我的 main.cpp 中调用时,出现 "has not been declared" 错误。我想弄清楚我哪里出错了,但运气不佳。我的 class header,目前(缩小以适合此处):

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)));

错误出现在 class header 需要枚举值的函数处。错误是枚举值 "has not been declared" - 它在其正上方的 public 标题中声明。我仍然是一个 C/C++ 新手,而且对 Qt 绝对是新手,因为我对它的了解不多。至少有人能指出我正确的方向吗?谢谢!

您对 enum 的呼叫是错误的。它们的范围是 class,而不是 class 对象。

试试这个:

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)));

编辑: 这将解决 "has not been declared" 错误,但我意识到您随后会遇到另一个错误。您正在尝试将参数传递给函数指针,这是行不通的。

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

通读此内容以获取更多信息:http://doc.qt.io/qt-5/signalsandslots.html

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

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

此外,如果您想使用枚举类型,您应该在 class 范围内使用枚举,方法是遵循 class 名称,例如:

main_funcs::up

首先,我建议将构造函数定义放在 cpp 文件中,而不是 class 定义文件中,这将有助于保持整洁并且不要像这样忘记关闭构造函数的大括号案例.

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

Thirds 信号和槽不能那样工作,你需要将 SIGNAL 签名与相同的槽签名连接起来你不能在连接期间传递实际参数我不认为那会永远有效,你应该也会得到很多启动期间的连接错误。