나는 트레이 아이콘 응용 프로그램을 creatig 그리고 난 아래 그림에서와 같이, 고급 상황에 맞는 메뉴를 생성하려면,하지만 난 단지사용자 인터페이스
QMenu* menu = new QMenu()
menu->addAction(QIcon(), "item", item1Click);
trayIcon->setContextMenu(menu);
와 간단한 - 메뉴를 만드는 방법을 알고 내가 어떻게 할 수 이 작업을 수행?
나는 트레이 아이콘 응용 프로그램을 creatig 그리고 난 아래 그림에서와 같이, 고급 상황에 맞는 메뉴를 생성하려면,하지만 난 단지사용자 인터페이스
QMenu* menu = new QMenu()
menu->addAction(QIcon(), "item", item1Click);
trayIcon->setContextMenu(menu);
와 간단한 - 메뉴를 만드는 방법을 알고 내가 어떻게 할 수 이 작업을 수행?
글쎄, 당신 코드를 표시하는 것이 좋습니다, 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();
}
QSystemTrayIcon에서 QWidgetAction을 사용하려고했지만 사용자 정의 위젯이 비어 있습니다 (마지막 스크린 샷과 같습니다). 왜 그런지 알기나 해? 일반적인 컨텍스트 메뉴에서 동일한 QWidgetAction()을 추가하면 완벽하게 작동합니다. 문제를 일으키는 것으로 보이는 시스템 트레이 상황에 맞는 메뉴입니다. – neoaggelos
귀하의 질문은 다소 모호하지만 [QWidgetAction'] (http://doc.qt.io/qt-5/qwidgetaction.html)이 귀하가 찾고있는 것으로 보입니다. –
간단한 컨텍스트 메뉴를 만드는 방법을 알았습니다. 나는 질문 자체에 이것을 기술했다. 그러나 이것은 목록에있는 항목들 중 가장 보편적 인 메뉴 일 것이고, 그림들과 같이 고급 메뉴를 만들고 싶습니다. 단추, 테이블 그리기 등을 아름답게 배치하십시오. –
맞아요. QWidgetAction을 사용하면 텍스트/아이콘 등으로 제한되지 않고 QWidget과 QAction을 연결할 수 있습니다. –