Im làm việc trong một dự án mà tôi cần mở (hiển thị hoặc bật lên) tự động các mục trong QMenuBar.Làm cách nào để lặp lại hành động của menu trong Qt?
Hãy nói rằng tôi có thanh menu tiếp theo:
File Edit Help
-op1 -op1 -op1
-op2 -op2 -op2
Để thiết lập một hành động (hiển thị menu asociated với hành động đó) tôi sử dụng:
menuBar->setActiveAction(mymenuactionpointer);
Như tôi biết, tôi có thể sử dụng một trong những điều sau đây để có danh sách các con trỏ tới các phần tử của QMenuBar:
QMenuBar::actions();
hoặc
QList<Object*> lst1 = QMenuBar::findChildren<QObject*>();
QList<Object*> lst2 = QMenuBar::findChildren<QAction*>();
Khi tôi sử dụng QMenuBar::findChildren<QAction*>()
hoặc MenuBar::actions()
tôi nhận được một danh sách các menu trong thanh menu, ý tôi là, tôi đã "File, Edit, Help"
từ QMenuBar tôi, kích thước của QList trong trường hợp này là 3.
Khi tôi sử dụng QMenuBar::findChildren<QObject*>()
Tôi nhận được một danh sách QObject có kích thước 6, đó là số lượng đúng các mục trong thanh trình đơn. Tuy nhiên, tôi đã tryied đúc để QAction *
QAction *a = (QAction *)lst1.at(0);
QAction *a = qobject_cast<QAction*>(lst1.at(0));
QAction *a = dynamic_cast<QAction*>(lst1.at(0));
Trong mọi trường hợp này a
không phải là NULL, nhưng khi tôi cố gắng để có được tên hành động QAction::title()
nó luôn gây cho tôi Segmentation Fault.
Tôi đã tìm kiếm và tìm thấy here rằng sau khi nhận danh sách tác vụ thanh thực đơn, người dùng có thể yêu cầu QAction::menu()
(trả về một con trỏ QMenu hợp lệ nếu mục đó là menu) để biết mục đó có phải là QMenu hay không , người ta có thể lặp lại nhận danh sách hành động của trình đơn đó và tiếp tục lặp lại. Nhưng điều này không làm việc cho tôi, tôi mong rằng cho
QList<Object*> lst2 = QMenuBar::findChildren<QAction*>();
mỗi phần tử "File, Edit Trợ giúp" QAction::menu()
trả về một con trỏ đơn hợp lệ, vì vậy tôi có thể nhận được danh sách các hành động của từng đơn, nhưng điều này không không làm việc cho tôi.
Tôi thực sự đánh giá cao thời gian và sự giúp đỡ của bạn, tôi hy vọng câu hỏi này sẽ giúp nhiều người hơn. Tôi thực sự gặp khó khăn với điều này.
Xin cảm ơn trước.
Tôi không chắc chắn về phần kết thúc của câu hỏi của bạn. 'QList list = menuBar() -> findChildren ();' trả về một danh sách hợp lệ của 'QMenu *' s mà bạn có thể lặp lại bằng cách sử dụng một hàm đệ quy, và bạn có thể nhận các hành động '->()' của chúng. Điều gì không hiệu quả với bạn? –
Hossein