2012-05-06 10 views
5

Vấn đề của tôi là khi tôi nhấp vào một mục trong QMenuBar, vị trí tương ứng sẽ được gọi hai lần. Tôi đang sử dụng Qt 4.8.1. Tôi không sử dụng Qt Designer cũng như tính năng "tự động kết nối". Dưới đây là đoạn mã của tôi mã:Tại sao vị trí này được gọi hai lần?

#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; 
       } 

}; 

Và chức năng chính:

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

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

    return app.exec(); 
} 

Nếu bạn biên dịch này (với các tập tin MOC), bạn sẽ thấy rằng cách nhấp vào "Click here" sẽ in " Kích hoạt "một lần, và" Hoặc ở đây "hai lần. Tôi không hiểu tại sao.

Tôi đang làm gì sai?

+0

Xin lỗi tôi đã không biên dịch mã của bạn và không phải là một thuật sĩ qt. Nhưng tôi đã xem qua ví dụ từ các trang qt của nokia (http://qt-project.org/doc/qt-4.8/mainwindows-menus.html) và dường như với tôi rằng chúng kết nối tín hiệu được kích hoạt với một số khe trong một cách: trong khi bạn kết nối SIGNAL (được kích hoạt (QAction *)) chúng kết nối SIGNAL (được kích hoạt()). Không thể nói nếu nó làm cho một sự khác biệt nhưng đây là một bình luận và không phải là một câu trả lời :-) – Matthias

+0

@Matthias: họ kết nối các hành động với các khe cắm trực tiếp trong những ví dụ, pintoch là tín hiệu kết nối QMenuBar, được coi là làm việc như ông dự định nó. (Tạo và kết nối các hành động trực tiếp sẽ là một cách giải quyết, nhưng không tốt - anh/cô ấy sẽ cần thêm chỗ hoặc người lập bản đồ tín hiệu ...) – Mat

+0

Không rõ bạn đang cố gắng làm gì ở đây, nhưng tôi nghi ngờ đó là điều gì đó khác nhau mà bạn nghĩ - Điều này thậm chí không thực sự tạo ra một thanh thực đơn trên OSX. Bạn nên tạo các đối tượng 'QMenu' và thêm chúng vào' QMenuBar'. Tôi nghi ngờ nó chỉ gửi toàn bộ danh sách các hành động đến vị trí của bạn. –

Trả lời

2

Tôi nhận được kết quả không chính xác giống như trên Windows 7 x64 bằng Qt 4.8.1. Điều này chắc chắn có vẻ giống như một lỗi.

Có một bug reported and fixed cho những gì dường như là hành vi tương tự trên Mac OS X. Mặc dù nó đã bị đóng cửa, có một bình luận duy nhất trên đó rằng họ đã quan sát vấn đề này trên Windows 7.

Tôi nghĩ nộp một báo cáo lỗi mới sẽ là một ý tưởng hay.

+0

Tôi tạo một vấn đề mới trên trình theo dõi lỗi. Cảm ơn bạn đã xác nhận. – pintoch