Russian Qt Forum

Qt => Общие вопросы => Тема начата: wenny от Июнь 17, 2016, 13:43



Название: Изменить QAction в меню в трее
Отправлено: wenny от Июнь 17, 2016, 13:43
Доброго времени суток. Есть меню, живущее в трее. Добавляю туда item:
Код
C++ (Qt)
QAction* connectionMenuItem = new QAction( trayIconMenu->addAction(
       QIcon( ":/connect.png" ),
       "Подключиться",
       parent,
       SLOT( connectToHipchatWithFileData() )
   ) );

Это есть кнопка подключения и отключения от сервера. Понятно, что после коннекта хотелось бы её переадаптировать под дисконнект. Для этого  сохраняю QAction и пытаюсь изменить, допустим, текст:
Код
C++ (Qt)
connectionMenuItem->setText( "Отключиться" );

однако текст нифига не меняется ??? Спасибо.


Название: Re: Изменить QAction в меню в трее
Отправлено: gil9red от Июнь 17, 2016, 13:53
Код
C++ (Qt)
QAction* connectionMenuItem = trayIconMenu->addAction(
       QIcon( ":/connect.png" ),
       "Подключиться",
       parent,
       SLOT( connectToHipchatWithFileData() )
);

addAction и так создает QAction


Название: Re: Изменить QAction в меню в трее
Отправлено: wenny от Июнь 17, 2016, 13:57
addAction и так создает QAction
Я пытался на него сослаться.


Название: Re: Изменить QAction в меню в трее
Отправлено: gil9red от Июнь 17, 2016, 14:01
addAction и так создает QAction
Я пытался на него сослаться.

Вы создали action и у него в родителях прописали, созданный в addAction, через конструктор QAction::QAction(QObject * parent)


Название: Re: Изменить QAction в меню в трее
Отправлено: wenny от Июнь 17, 2016, 14:06
Вы создали action и у него в родителях прописали, созданный в addAction, через конструктор QAction::QAction(QObject * parent)
Так что мне делать и как жить?


Название: Re: Изменить QAction в меню в трее
Отправлено: gil9red от Июнь 17, 2016, 14:23
Вы создали action и у него в родителях прописали, созданный в addAction, через конструктор QAction::QAction(QObject * parent)
Так что мне делать и как жить?

1.
Использовтаь один QAction. Завести флаг и по флагу менять его текст, а в слоте -- действия.

2.
Завести 2 QAction. И по флагу прятать/показывать нужный QAction


Название: Re: Изменить QAction в меню в трее
Отправлено: wenny от Июнь 17, 2016, 14:26
А можно ли просто грохнуть определенный QAction и на то же место водрузить другой? Чтобы так не изголяться.


Название: Re: Изменить QAction в меню в трее
Отправлено: kambala от Июнь 17, 2016, 14:32
можно, но все равно ж надо знать как его найти или сохранять его в поле класса :)


Название: Re: Изменить QAction в меню в трее
Отправлено: wenny от Июнь 17, 2016, 14:36
можно, но все равно ж надо знать как его найти или сохранять его в поле класса :)
Вот я и запутался. Без примеров до утра буду кнопкотыкать :'( Мне не удается ничего сменить.


Название: Re: Изменить QAction в меню в трее
Отправлено: gil9red от Июнь 17, 2016, 14:48
можно, но все равно ж надо знать как его найти или сохранять его в поле класса :)
Вот я и запутался. Без примеров до утра буду кнопкотыкать :'( Мне не удается ничего сменить.

Пожалуйста:

Код
C++ (Qt)
#include <QMainWindow>
#include <QSystemTrayIcon>
 
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
   public:
       explicit MainWindow(QWidget *parent = 0);
 
   private slots:
       void messageReceived(QSystemTrayIcon::ActivationReason reason);
 
   public slots:
       void changeConnect(bool connect);
 
   private:
       QSystemTrayIcon tray;
       QAction* changeConnectAction;
};
 

Код
C++ (Qt)
#include "mainwindow.h"
#include <QMenu>
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent)
{
   tray.setIcon(QIcon(":/app_icon"));
   tray.setToolTip("Tray!");
 
   connect(&tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(messageReceived(QSystemTrayIcon::ActivationReason)));
 
   QMenu * trayMenu = new QMenu();
   changeConnectAction = trayMenu->addAction("Connect", this, SLOT(changeConnect(bool)));
   trayMenu->addSeparator();
   trayMenu->addAction("About");
   trayMenu->addSeparator();
   trayMenu->addAction("Quit");
 
   tray.setContextMenu(trayMenu);
   tray.show();
}
 
void MainWindow::messageReceived(QSystemTrayIcon::ActivationReason reason)
{
   if (reason == QSystemTrayIcon::Trigger) {
       setVisible(!isVisible());
   }
}
 
void MainWindow::changeConnect(bool connect) {
   if (connect) {
       changeConnectAction->setText("Connect");
       /// ...
 
   } else {
       changeConnectAction->setText("Disconnect");
       /// ...
 
   }
}
 
 


Название: Re: Изменить QAction в меню в трее
Отправлено: wenny от Июнь 17, 2016, 17:47
Все, я понял свой косяк, спасибо :)