Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. General Architecture Help
Qt 6.11 is out! See what's new in the release blog

General Architecture Help

Scheduled Pinned Locked Moved General and Desktop
2 Posts 2 Posters 1.5k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • E Offline
    E Offline
    EStudley
    wrote on last edited by
    #1

    I've done a lot of small QML and Qt applications, but not I'm starting on a large project for my senior year. I've been trying to implement my application the way I want it but I keep messing up and noticing I have to re-architecture my entire program. I just need some help before I go any further developing and have to re do it all again.

    I want my application to be one main window that is entirely defined by QML. I want it to not close when the main window is closed, but only when the system icon is clicked and exited. I know to do this I need to set viewer.setQuitOnLastWindowClosed(false), but this also means I have to subclass ": public QSystemTrayIcon".

    So should I create a Qt Widgets Application with base class MainWindow? How can I subclass QSystemTrayIcon if it's a MainWindow? Do I always need "qtquick2applicationviewer" to view QML?

    I feel like every example I find for Qt is versions out of date and I just can't seem to put a large project together without it falling apart because I can't seem to get the pieces working together.

    1 Reply Last reply
    0
    • A Offline
      A Offline
      adolby
      wrote on last edited by
      #2

      You can use QMainWindow with a system tray icon. Overriding the closeEvent method is the key to keeping the application from exiting except through the system tray icon. I added code in to restore the window when the user clicks the system tray icon. I also added code to inform the user the first time that he or she exits the application that the application will continue running in the system tray.

      Here's a sketch I made up, inspired by the System Tray Example.

      MainWindow.hpp

      @#ifndef MAINWINDOW_H
      #define MAINWINDOW_H

      #include <QSystemTrayIcon>
      #include <QWidget>
      #include <QMainWindow>
      #include <QCloseEvent>
      #include <QMenu>
      #include <QAction>

      class MainWindow : public QMainWindow
      {
      Q_OBJECT

      public:
      explicit MainWindow(QWidget* parent = NULL);

      void setIcon();
      

      public slots:
      void iconActivated(QSystemTrayIcon::ActivationReason reason);

      protected:
      virtual void closeEvent(QCloseEvent* event);

      private:
      QAction* restoreAction;
      QAction* quitAction;

      QSystemTrayIcon* trayIcon;
      QMenu* trayIconMenu;
      
      bool userInformed;
      

      };

      #endif
      @

      MainWindow.cpp

      @#include "MainWindow.hpp"

      #include <QApplication>
      #include <QMessageBox>
      #include <QVBoxLayout>

      MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
      {
      restoreAction = new QAction(tr("&Restore"), this);
      connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal()));

      quitAction = new QAction(tr("&Quit"), this);
      connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));

      trayIconMenu = new QMenu(this);
      trayIconMenu->addAction(restoreAction);
      trayIconMenu->addSeparator();
      trayIconMenu->addAction(quitAction);

      trayIcon = new QSystemTrayIcon(this);
      trayIcon->setContextMenu(trayIconMenu);

      connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
      this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));

      const QIcon icon(":/images/heart.png");
      trayIcon->setIcon(icon);
      setWindowIcon(icon);

      QWidget* mainWidget = new QWidget();
      QVBoxLayout* mainLayout = new QVBoxLayout(mainWidget);
      // Add your widgets here

      setCentralWidget(mainWidget);

      trayIcon->show();

      setWindowTitle(tr("Your App"));
      resize(400, 300);
      }

      void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason)
      {
      switch (reason)
      {
      case QSystemTrayIcon::Trigger:
      case QSystemTrayIcon::DoubleClick:
      showNormal();
      break;
      default:
      break;
      }
      }

      void MainWindow::closeEvent(QCloseEvent* event)
      {
      if (trayIcon->isVisible())
      {
      if (!userInformed)
      {
      QMessageBox::information(this, tr("Your App"),
      tr("The application is still running in the system tray."));
      userInformed = true;
      }

      hide();
      event->ignore();
      

      }
      }@

      main.cpp
      @#include <QApplication>

      #include "MainWindow.hpp"

      int main(int argc, char *argv[])
      {
      QApplication app(argc, argv);

      QApplication::setQuitOnLastWindowClosed(false);
      
      MainWindow mainWindow;
      mainWindow.show();
      return app.exec(&#41;;
      

      }
      @

      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved