2012-05-06 116 views
5

我的问题是,当我点击QMenuBar中的一个项目时,相应的插槽会被调用两次。我正在使用Qt 4.8.1。我没有使用Qt Designer,也没有使用“自动连接”功能。这里是我的代码片段:为什么此槽被调用两次?

#include <iostream> 
#include <QWidget> 
#include <QMenuBar> 

class MyWidget : public QWidget 
{ 
     Q_OBJECT 
     public: 
       MyWidget(QWidget *parent = 0) : QWidget(parent) 
       { 
         QMenuBar *menu = new QMenuBar(this); 
         menu->addAction("Click here"); 
         menu->addAction("Or here"); 
         connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(handleAction(QAction*))); 
       } 

     public slots: 
       void handleAction(QAction *action) 
       { 
         std::cout << "Triggered" << std::endl; 
       } 

}; 

和主要功能:

#include "main.h" 
#include <QApplication> 

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    MyWidget w; 
    w.show(); 

    return app.exec(); 
} 

如果您编译这个(与MOC文件),你会看到,点击“点击这里”将打印“触发“一次,和”或这里“两次。我不明白为什么。

我在做什么错?

+0

对不起,我没有编译代码,我不Qt的向导。但我查看了诺基亚qt页面的例子(http://qt-project.org/doc/qt-4.8/mainwindows-menus.html),在我看来,他们将触发信号连接到不同的插槽方式:当你连接SIGNAL(触发(QAction *))时,它们连接SIGNAL(triggered())。不知道它是否有所作为,但这是一个评论,而不是一个答案:-) – Matthias

+0

@Matthias:他们将动作直接连接到这些示例中的插槽,pintoch是连接QMenuBar的信号,这应该与他一样工作打算这样做。 (直接创建和连接操作将是一种解决方法,但不是很好 - 他/她需要更多的插槽或信号映射器......) – Mat

+0

目前尚不清楚你在这里做什么*尝试*,但我怀疑它是某种东西不同,你认为 - 这实际上甚至不会在OSX上产生菜单栏。你应该创建'QMenu'对象并将它们添加到'QMenuBar'中。我怀疑这只是将整个动作列表发送到您的插槽。 –

回答

2

我在使用Qt 4.8.1的Windows 7 x64上得到和你一样的错误结果。这当然看起来像一个错误。

有什么似乎是虽然已经关闭,在Mac OS X上的相同行为bug reported and fixed,对一个单一的评论,他们在Windows 7中观察到这个问题

我想申请一个新的错误报告将是一个好主意。

+0

我在bug跟踪器上创建了一个新问题。感谢您的确认。 – pintoch

相关问题