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?
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
@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
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. –