枚举类中的值 - Qt Creator

时间:2015-02-10 14:14:26

标签: c++ qt enums

我创建了一个包含枚举值的函数类,但是当我在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 ++ newb,对Qt来说肯定是新手,因为我没有做太多。至少有人能指出我正确的方向吗?谢谢!

3 个答案:

答案 0 :(得分:4)

您对enum的来电是错误的。它们的范围是类,而不是类对象。

试试这个:

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

答案 1 :(得分:0)

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

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

此外,如果要使用枚举类型,则应通过遵循类名称来使用类范围中的枚举:

main_funcs::up

答案 2 :(得分:0)

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

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

三分之一的信号和插槽不能以这种方式工作,你需要连接SIGNAL签名和相同的插槽签名,你不能在连接期间传递实际参数我不会做任何事情,你应该得到很多连接启动时出错。