2017-12-13 1 views
0

나는 트레이 아이콘 응용 프로그램을 creatig 그리고 난 아래 그림에서와 같이, 고급 상황에 맞는 메뉴를 생성하려면,하지만 난 단지사용자 인터페이스

QMenu* menu = new QMenu() 
menu->addAction(QIcon(), "item", item1Click); 
trayIcon->setContextMenu(menu); 

와 간단한 - 메뉴를 만드는 방법을 알고 내가 어떻게 할 수 이 작업을 수행? first example second example

+0

귀하의 질문은 다소 모호하지만 [QWidgetAction'] (http://doc.qt.io/qt-5/qwidgetaction.html)이 귀하가 찾고있는 것으로 보입니다. –

+0

간단한 컨텍스트 메뉴를 만드는 방법을 알았습니다. 나는 질문 자체에 이것을 기술했다. 그러나 이것은 목록에있는 항목들 중 가장 보편적 인 메뉴 일 것이고, 그림들과 같이 고급 메뉴를 만들고 싶습니다. 단추, 테이블 그리기 등을 아름답게 배치하십시오. –

+0

맞아요. QWidgetAction을 사용하면 텍스트/아이콘 등으로 제한되지 않고 QWidget과 QAction을 연결할 수 있습니다. –

답변

0

글쎄, 당신 코드를 표시하는 것이 좋습니다, supose입니다 :


main.h

#ifndef MAIN_H 
#define MAIN_H 

#include <QtWidgets/QApplication> 
#include <QtCore/QDebug> 
#include <QtGui/QIcon> 
#include <QtWidgets/QSystemTrayIcon> 
#include <QtWidgets/QMainWindow> 
#include <QtWidgets/QMenu> 
#include <QtWidgets/QWidgetAction> 
#include <QtWidgets/QPushButton> 
#include <QtWidgets/QHBoxLayout> 
#include <QtWidgets/QSpinBox> 
#include <QtWidgets/QLabel> 

class SpinBoxAction : public QWidgetAction 
{ 
public: 
    SpinBoxAction (const QString& title) : QWidgetAction (NULL) 
    { 
     QWidget* Widget = new QWidget (NULL); 
     QHBoxLayout* Layout = new QHBoxLayout(); 
     QLabel* Label = new QLabel (title); 
     Layout->addWidget (Label); 
     SpinBox = new QSpinBox(NULL); 
     Layout->addWidget (SpinBox); 
     Widget->setLayout (Layout); 

     setDefaultWidget(Widget); 
    } 

    QSpinBox* spinBox() 
    { 
     return SpinBox; 
    } 

private: 
    QSpinBox* SpinBox; 
}; 

class Reciever : public QObject 
{ 
private: 
    QSystemTrayIcon* trayIcon; 
public: 
    Reciever() 
    { 

    } 
    void setup(QSystemTrayIcon* trayIcon) 
    { 
     this->trayIcon = trayIcon; 
    } 

    Q_OBJECT 
public slots: 
    void action(int i) 
    { 
     trayIcon->showMessage("changed", "spin box value has been changed", QSystemTrayIcon::NoIcon, 1000); 
    } 

    void onActivated(QSystemTrayIcon::ActivationReason reason) 
    { 
     trayIcon->showMessage("activated", "tray icon has been activated", QSystemTrayIcon::NoIcon, 1000); 
    } 
}; 

#endif // MAIN_H 


MAIN.CPP

#include <main.h> 
#include <QtWidgets/QApplication> 
#include <QtCore/QDebug> 
#include <QtGui/QIcon> 
#include <QtWidgets/QSystemTrayIcon> 
#include <QtWidgets/QMainWindow> 
#include <QtWidgets/QMenu> 
#include <QtWidgets/QWidgetAction> 
#include <QtWidgets/QPushButton> 
#include <QtWidgets/QHBoxLayout> 

int main(int argc, char** argv) 
{ 
    Reciever* reciever = new Reciever(); 

    QApplication app(argc, argv); 

    QSystemTrayIcon* trayIcon = new QSystemTrayIcon(QIcon(":/images/abc.png")); 
    if (!trayIcon->isSystemTrayAvailable()) exit(1); 

    QMenu* menu = new QMenu(); 
    SpinBoxAction* spinBoxAction = new SpinBoxAction("Action Title"); 
    menu->addAction(spinBoxAction); 

    QObject::connect(spinBoxAction->spinBox(), SIGNAL(valueChanged(int)), reciever, SLOT(action(int))); 

    trayIcon->setContextMenu(menu); 
    trayIcon->setVisible(true); 

    QObject::connect(trayIcon, &QSystemTrayIcon::activated, reciever, &Reciever::onActivated); 
    reciever->setup(trayIcon); 

    return app.exec(); 
} 

을 그리고 리드 하나의 빈 요소가있는 단순 목록 메뉴 :
result of this

+0

QSystemTrayIcon에서 QWidgetAction을 사용하려고했지만 사용자 정의 위젯이 비어 있습니다 (마지막 스크린 샷과 같습니다). 왜 그런지 알기나 해? 일반적인 컨텍스트 메뉴에서 동일한 QWidgetAction()을 추가하면 완벽하게 작동합니다. 문제를 일으키는 것으로 보이는 시스템 트레이 상황에 맞는 메뉴입니다. – neoaggelos