QMenu *<< QAction * - 帮我写一个全球QMenu插入算子

时间:2009-12-24 05:00:05

标签: c++ qt

如果没有其他原因而不是为了我自己的娱乐,我希望编写一个全局插入操作符,以便我可以使用花哨的代码:

aQMenu << aQAction1 << aQAction2 << aQAction2 << seperator << aQAction3;

也许你讨厌语法,但我至少想尝试使用它。问题是,这是我第一次尝试编写插入操作符代码,而且我很难过。将枚举“分隔符”插入QMenu *的代码很简单,我有这个工作,但我认为这段代码适用于将QAction *插入QMenu *:

// does not compile:  "must have an argument of class or enumerated type"
QMenu *operator<< (QMenu *menu, QAction *action)
{
        menu->addAction(action);
        return menu;
}

编译器抱怨说这个函数需要一个类或枚举类型的参数,这让我感到困惑,因为第二个参数属于类类型。我试图用&符号重写这个函数,但我没有碰到它正确地写下来的方式。我已经看了很多关于网络示例的内容,并认为现在是时候讨论这个问题了。

我知道有些编码员会抱怨我偏离标准的Qt语法,但我很乐意重载运算符&lt;&lt;与其他课程一样。似乎插入操作符在这里工作得很好。我能说什么 - 这让我很开心。

2 个答案:

答案 0 :(得分:5)

编译器抱怨因为所有参数都是指针。使用运算符菜单参数的引用,它将如下所示:

QMenu& operator<< (QMenu &menu, QAction *action) {
    menu.addAction(action);
    return menu;
}

现在这个操作符应该处理菜单对象。如果要将其与指向菜单的指针一起使用,则需要在应用新的<<运算符时取消引用该指针:

QMenu *menu = new QMenu();
QAction *action1, *action2;
...
*menu << action1 << action2;

答案 1 :(得分:0)

现在一切正常。我使用代码

QMenu& operator<< (QMenu &menu, QAction *action) {
    menu.addAction(action);
    return menu;
}

所以我可以使用

的漂亮小语法来处理我的QMenu
*mnuFile << actNewFile << actOpenFile << actCloseFile << seperator << actExit;

(另一段代码片段允许插入操作符接受我的“seperator”参数)。

另外,我在这些论坛上看到Andrei Alexandrescu在“现代C ++设计”中专注于智能记录器单例的几页。我仍在努力抓住我的操作员&lt;&lt;代码

QMenu* operator<< (QMenu* obj, MyMenuInsertEnum val);

有效(第一个参数是指针)。但这不是:

QMenu *operator<< (QMenu *menu, QAction *action);

问题只是指针作为第一个参数。在我读完上述书之后,我会在这里附上我的发现,只要我学到新东西。