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. How to change the build/ window name of application?
Forum Updated to NodeBB v4.3 + New Features

How to change the build/ window name of application?

Scheduled Pinned Locked Moved Solved General and Desktop
13 Posts 4 Posters 7.7k 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.
  • H himanshu chauhan

    If I am trying to write this code following error is coming-
    df945037-d7b7-4efc-959e-bda6b7203f74-image.png

    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on last edited by
    #4

    @himanshu-chauhan Please post code and error messages as text.
    You need to call that meathod on your top level widget. Usually it is a QMainWindow instance.

    https://forum.qt.io/topic/113070/qt-code-of-conduct

    H 1 Reply Last reply
    1
    • jsulmJ jsulm

      @himanshu-chauhan Please post code and error messages as text.
      You need to call that meathod on your top level widget. Usually it is a QMainWindow instance.

      H Offline
      H Offline
      himanshu chauhan
      wrote on last edited by
      #5

      @jsulm
      Ther error is-
      C:\Users\hc243\PROJECT_ASSIGNEMENT\Qgroundcontrol\src\main.cc:241: error: C2352: 'QWidget::setWindowTitle': a call of a non-static member function requires an object
      D:\QT\5.15.2\msvc2019_64\include\QtWidgets/qwidget.h(365): note: see declaration of 'QWidget::setWindowTitle'

      What do mean by "top level widget".

      jsulmJ 1 Reply Last reply
      0
      • H himanshu chauhan

        @jsulm
        Ther error is-
        C:\Users\hc243\PROJECT_ASSIGNEMENT\Qgroundcontrol\src\main.cc:241: error: C2352: 'QWidget::setWindowTitle': a call of a non-static member function requires an object
        D:\QT\5.15.2\msvc2019_64\include\QtWidgets/qwidget.h(365): note: see declaration of 'QWidget::setWindowTitle'

        What do mean by "top level widget".

        jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #6

        @himanshu-chauhan said in How to change the build/ window name of application?:

        What do mean by "top level widget".

        I mean the widget representing your main window.
        Please post the whole content of your main() function then I can tell you what exactly you need to do.

        The error message tells you that setWindowTitle() is a non static method, so you need an object on which you call it (basic C++).

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        H 1 Reply Last reply
        1
        • jsulmJ jsulm

          @himanshu-chauhan said in How to change the build/ window name of application?:

          What do mean by "top level widget".

          I mean the widget representing your main window.
          Please post the whole content of your main() function then I can tell you what exactly you need to do.

          The error message tells you that setWindowTitle() is a non static method, so you need an object on which you call it (basic C++).

          H Offline
          H Offline
          himanshu chauhan
          wrote on last edited by
          #7

          @jsulm
          this is the whole main.cc file-

          #include <QtGlobal>
          #include <QApplication>
          #include <QIcon>
          #include <QSslSocket>
          #include <QMessageBox>
          #include <QProcessEnvironment>
          #include <QHostAddress>
          #include <QUdpSocket>
          #include <QtPlugin>
          #include <QStringListModel>

          #include "QGC.h"
          #include "QGCApplication.h"
          #include "AppMessages.h"
          #include "SDL_video.h"

          #ifndef NO_SERIAL_LINK
          #include "SerialLink.h"
          #endif

          #ifndef mobile
          #include "QGCSerialPortInfo.h"
          #include "RunGuard.h"
          #ifndef NO_SERIAL_LINK
          #include <QSerialPort>
          #endif
          #endif

          #ifdef UNITTEST_BUILD
          #include "UnitTest.h"
          #endif

          #ifdef QT_DEBUG
          #include "CmdLineOptParser.h"
          #ifdef Q_OS_WIN
          #include <crtdbg.h>
          #endif
          #endif

          #ifdef QGC_ENABLE_BLUETOOTH
          #include <QtBluetooth/QBluetoothSocket>
          #endif

          #include <iostream>
          #include "QGCMapEngine.h"

          /* SDL does ugly things to main() */
          #ifdef main
          #undef main
          #endif

          #ifndef mobile
          #ifndef NO_SERIAL_LINK
          Q_DECLARE_METATYPE(QGCSerialPortInfo)
          #endif
          #endif

          #ifdef Q_OS_WIN

          #include <windows.h>
          /// @brief CRT Report Hook installed using _CrtSetReportHook. We install this hook when
          /// we don't want asserts to pop a dialog on windows.
          int WindowsCrtReportHook(int reportType, char* message, int* returnValue)
          {
          Q_UNUSED(reportType);

          std::cerr << message << std::endl;  // Output message to stderr
          *returnValue = 0;                   // Don't break into debugger
          return true;                        // We handled this fully ourselves
          

          }

          #endif

          #if defined(android)
          #include <jni.h>
          #include "JoystickAndroid.h"
          #if defined(QGC_ENABLE_PAIRING)
          #include "PairingManager.h"
          #endif
          #if !defined(NO_SERIAL_LINK)
          #include "qserialport.h"
          #endif

          static jobject _class_loader = nullptr;
          static jobject _context = nullptr;

          //-----------------------------------------------------------------------------
          extern "C" {
          void gst_amc_jni_set_java_vm(JavaVM *java_vm);

          jobject gst_android_get_application_class_loader(void)
          {
              return _class_loader;
          }
          

          }

          //-----------------------------------------------------------------------------
          static void
          gst_android_init(JNIEnv* env, jobject context)
          {
          jobject class_loader = nullptr;

          jclass context_cls = env->GetObjectClass(context);
          if (!context_cls) {
              return;
          }
          
          jmethodID get_class_loader_id = env->GetMethodID(context_cls, "getClassLoader", "()Ljava/lang/ClassLoader;");
          if (env->ExceptionCheck()) {
              env->ExceptionDescribe();
              env->ExceptionClear();
              return;
          }
          
          class_loader = env->CallObjectMethod(context, get_class_loader_id);
          if (env->ExceptionCheck()) {
              env->ExceptionDescribe();
              env->ExceptionClear();
              return;
          }
          
          _context = env->NewGlobalRef(context);
          _class_loader = env->NewGlobalRef (class_loader);
          

          }

          //-----------------------------------------------------------------------------
          static const char kJniClassName[] {"org/mavlink/qgroundcontrol/QGCActivity"};

          void setNativeMethods(void)
          {
          JNINativeMethod javaMethods[] {
          {"nativeInit", "()V", reinterpret_cast<void *>(gst_android_init)}
          };

          QAndroidJniEnvironment jniEnv;
          if (jniEnv->ExceptionCheck()) {
              jniEnv->ExceptionDescribe();
              jniEnv->ExceptionClear();
          }
          
          jclass objectClass = jniEnv->FindClass(kJniClassName);
          if(!objectClass) {
              qWarning() << "Couldn't find class:" << kJniClassName;
              return;
          }
          
          jint val = jniEnv->RegisterNatives(objectClass, javaMethods, sizeof(javaMethods) / sizeof(javaMethods[0]));
          
          if (val < 0) {
              qWarning() << "Error registering methods: " << val;
          } else {
              qDebug() << "Main Native Functions Registered";
          }
          
          if (jniEnv->ExceptionCheck()) {
              jniEnv->ExceptionDescribe();
              jniEnv->ExceptionClear();
          }
          

          }

          //-----------------------------------------------------------------------------
          jint JNI_OnLoad(JavaVM* vm, void* reserved)
          {
          Q_UNUSED(reserved);

          JNIEnv* env;
          if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
              return -1;
          }
          
          setNativeMethods();
          

          #if defined(QGC_GST_STREAMING)
          // Tell the androidmedia plugin about the Java VM
          gst_amc_jni_set_java_vm(vm);
          #endif

          #if !defined(NO_SERIAL_LINK)
          QSerialPort::setNativeMethods();
          #endif

          JoystickAndroid::setNativeMethods();
          

          #if defined(QGC_ENABLE_PAIRING)
          PairingManager::setNativeMethods();
          #endif

          return JNI_VERSION_1_6;
          

          }
          #endif

          //-----------------------------------------------------------------------------
          #ifdef android
          #include <QtAndroid>
          bool checkAndroidWritePermission() {
          QtAndroid::PermissionResult r = QtAndroid::checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");
          if(r == QtAndroid::PermissionResult::Denied) {
          QtAndroid::requestPermissionsSync( QStringList() << "android.permission.WRITE_EXTERNAL_STORAGE" );
          r = QtAndroid::checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");
          if(r == QtAndroid::PermissionResult::Denied) {
          return false;
          }
          }
          return true;
          }
          #endif

          // To shut down QGC on Ctrl+C on Linux
          #ifdef Q_OS_LINUX
          #include <csignal>

          void sigHandler(int s)
          {
          std::signal(s, SIG_DFL);
          QApplication::instance()->quit();
          }

          #endif /* Q_OS_LINUX */

          //-----------------------------------------------------------------------------
          /**
          @brief Starts the application

          @param argc Number of commandline arguments
          @param argv Commandline arguments
          @return exit code, 0 for normal exit and !=0 for error cases
          */

          int main(int argc, char *argv[])
          {
          QWidget::setWindowTitle("Title1");
          #ifndef mobile
          // We make the runguard key different for custom and non custom
          // builds, so they can be executed together in the same device.
          // Stable and Daily have same QGC_APPLICATION_NAME so they would
          // not be able to run at the same time
          QString runguardString(QGC_APPLICATION_NAME);
          runguardString.append("RunGuardKey");

          RunGuard guard(runguardString);
          if (!guard.tryToRun()) {
              // QApplication is necessary to use QMessageBox
              QApplication errorApp(argc, argv);
              QMessageBox::critical(nullptr, QObject::tr("Error"),
                  QObject::tr("A second instance of %1 is already running. Please close the other instance and try again.").arg(QGC_APPLICATION_NAME)
              );
              return -1;
          }
          

          #endif

          //-- Record boot time
          QGC::initTimer();
          

          #ifdef Q_OS_UNIX
          //Force writing to the console on UNIX/BSD devices
          if (!qEnvironmentVariableIsSet("QT_LOGGING_TO_CONSOLE"))
          qputenv("QT_LOGGING_TO_CONSOLE", "1");
          #endif

          // install the message handler
          AppMessages::installHandler();
          

          #ifdef Q_OS_MAC
          #ifndef ios
          // Prevent Apple's app nap from screwing us over
          // tip: the domain can be cross-checked on the command line with <defaults domains>
          QProcess::execute("defaults", {"write org.qgroundcontrol.qgroundcontrol NSAppSleepDisabled -bool YES"});
          #endif
          #endif

          #ifdef Q_OS_WIN
          // Set our own OpenGL buglist
          qputenv("QT_OPENGL_BUGLIST", ":/opengl/resources/opengl/buglist.json");

          // Allow for command line override of renderer
          for (int i = 0; i < argc; i++) {
              const QString arg(argv[i]);
              if (arg == QStringLiteral("-angle")) {
                  QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
                  break;
              } else if (arg == QStringLiteral("-swrast")) {
                  QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
                  break;
              }
          }
          

          #endif

          #ifdef Q_OS_LINUX
          std::signal(SIGINT, sigHandler);
          std::signal(SIGTERM, sigHandler);
          #endif /* Q_OS_LINUX */

          // The following calls to qRegisterMetaType are done to silence debug output which warns
          // that we use these types in signals, and without calling qRegisterMetaType we can't queue
          // these signals. In general we don't queue these signals, but we do what the warning says
          // anyway to silence the debug output.
          

          #ifndef NO_SERIAL_LINK
          qRegisterMetaTypeQSerialPort::SerialPortError();
          #endif
          #ifdef QGC_ENABLE_BLUETOOTH
          qRegisterMetaTypeQBluetoothSocket::SocketError();
          qRegisterMetaType<QBluetoothServiceInfo>();
          #endif
          qRegisterMetaTypeQAbstractSocket::SocketError();
          #ifndef mobile
          #ifndef NO_SERIAL_LINK
          qRegisterMetaType<QGCSerialPortInfo>();
          #endif
          #endif

          qRegisterMetaType<Vehicle::MavCmdResultFailureCode_t>("Vehicle::MavCmdResultFailureCode_t");
          
          // We statically link our own QtLocation plugin
          

          #ifdef Q_OS_WIN
          // In Windows, the compiler doesn't see the use of the class created by Q_IMPORT_PLUGIN
          #pragma warning( disable : 4930 4101 )
          #endif

          Q_IMPORT_PLUGIN(QGeoServiceProviderFactoryQGC)
          
          bool runUnitTests = false;          // Run unit tests
          

          #ifdef QT_DEBUG
          // We parse a small set of command line options here prior to QGCApplication in order to handle the ones
          // which need to be handled before a QApplication object is started.

          bool stressUnitTests = false;       // Stress test unit tests
          bool quietWindowsAsserts = false;   // Don't let asserts pop dialog boxes
          
          QString unitTestOptions;
          CmdLineOpt_t rgCmdLineOptions[] = {
              { "--unittest",             &runUnitTests,          &unitTestOptions },
              { "--unittest-stress",      &stressUnitTests,       &unitTestOptions },
              { "--no-windows-assert-ui", &quietWindowsAsserts,   nullptr },
              // Add additional command line option flags here
          };
          
          ParseCmdLineOptions(argc, argv, rgCmdLineOptions, sizeof(rgCmdLineOptions)/sizeof(rgCmdLineOptions[0]), false);
          if (stressUnitTests) {
              runUnitTests = true;
          }
          
          if (quietWindowsAsserts) {
          

          #ifdef Q_OS_WIN
          _CrtSetReportHook(WindowsCrtReportHook);
          #endif
          }

          #ifdef Q_OS_WIN
          if (runUnitTests) {
          // Don't pop up Windows Error Reporting dialog when app crashes. This prevents TeamCity from
          // hanging.
          DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
          SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
          }
          #endif
          #endif // QT_DEBUG

          QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
          QGCApplication* app = new QGCApplication(argc, argv, runUnitTests);
          Q_CHECK_PTR(app);
          if(app->isErrorState()) {
              app->exec();
              return -1;
          }
          

          #ifdef Q_OS_LINUX
          QApplication::setWindowIcon(QIcon(":/res/resources/icons/qgroundcontrol.ico"));
          #endif /* Q_OS_LINUX */

          // There appears to be a threading issue in qRegisterMetaType which can cause it to throw a qWarning
          // about duplicate type converters. This is caused by a race condition in the Qt code. Still working
          // with them on tracking down the bug. For now we register the type which is giving us problems here
          // while we only have the main thread. That should prevent it from hitting the race condition later
          // on in the code.
          qRegisterMetaType<QList<QPair<QByteArray,QByteArray> > >();
          
          app->_initCommon();
          //-- Initialize Cache System
          getQGCMapEngine()->init();
          
          int exitCode = 0;
          

          #ifdef UNITTEST_BUILD
          if (runUnitTests) {
          for (int i=0; i < (stressUnitTests ? 20 : 1); i++) {
          if (!app->_initForUnitTests()) {
          return -1;
          }

                  // Run the test
                  int failures = UnitTest::run(unitTestOptions);
                  if (failures == 0) {
                      qDebug() << "ALL TESTS PASSED";
                      exitCode = 0;
                  } else {
                      qDebug() << failures << " TESTS FAILED!";
                      exitCode = -failures;
                      break;
                  }
              }
          } else
          

          #endif
          {

          #ifdef android
          checkAndroidWritePermission();
          #endif
          if (!app->_initForNormalAppBoot()) {
          return -1;
          }
          exitCode = app->exec();
          }

          app->_shutdown();
          delete app;
          //-- Shutdown Cache System
          destroyMapEngine();
          
          qDebug() << "After app delete";
          
          return exitCode;
          

          }

          1 Reply Last reply
          0
          • jsulmJ Offline
            jsulmJ Offline
            jsulm
            Lifetime Qt Champion
            wrote on last edited by
            #8

            This is a lot of code and I can't see where you're creating any windows?
            Does QGCApplication create the window?
            Does your application have a QMainWindow instance?

            https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply
            1
            • H Offline
              H Offline
              himanshu chauhan
              wrote on last edited by
              #9

              I am new to the platform so I can't really say where the window is been created but it seems that QGCApplication is doing that work. I found following code in it-

              bool QGCApplication::_initForNormalAppBoot()
              {
              QSettings settings;

              _qmlAppEngine = toolbox()->corePlugin()->createQmlApplicationEngine(this);
              toolbox()->corePlugin()->createRootWindow(_qmlAppEngine);
              
              // Image provider for PX4 Flow
              QQuickImageProvider* pImgProvider = dynamic_cast<QQuickImageProvider*>(qgcApp()->toolbox()->imageProvider());
              _qmlAppEngine->addImageProvider(QStringLiteral("QGCImages"), pImgProvider);
              
              QQuickWindow* rootWindow = qgcApp()->mainRootWindow();
              
              if (rootWindow) {
                  rootWindow->scheduleRenderJob (new FinishVideoInitialization (toolbox()->videoManager()),
                          QQuickWindow::BeforeSynchronizingStage);
              }
              

              }

              jsulmJ 1 Reply Last reply
              0
              • H himanshu chauhan

                I am new to the platform so I can't really say where the window is been created but it seems that QGCApplication is doing that work. I found following code in it-

                bool QGCApplication::_initForNormalAppBoot()
                {
                QSettings settings;

                _qmlAppEngine = toolbox()->corePlugin()->createQmlApplicationEngine(this);
                toolbox()->corePlugin()->createRootWindow(_qmlAppEngine);
                
                // Image provider for PX4 Flow
                QQuickImageProvider* pImgProvider = dynamic_cast<QQuickImageProvider*>(qgcApp()->toolbox()->imageProvider());
                _qmlAppEngine->addImageProvider(QStringLiteral("QGCImages"), pImgProvider);
                
                QQuickWindow* rootWindow = qgcApp()->mainRootWindow();
                
                if (rootWindow) {
                    rootWindow->scheduleRenderJob (new FinishVideoInitialization (toolbox()->videoManager()),
                            QQuickWindow::BeforeSynchronizingStage);
                }
                

                }

                jsulmJ Offline
                jsulmJ Offline
                jsulm
                Lifetime Qt Champion
                wrote on last edited by jsulm
                #10

                @himanshu-chauhan

                QQuickWindow* rootWindow = qgcApp()->mainRootWindow();
                
                if (rootWindow) {
                    rootWindow->setTitle("YOUR TITLE HERE");
                

                See https://doc.qt.io/qt-6/qwindow.html#title-prop

                https://forum.qt.io/topic/113070/qt-code-of-conduct

                1 Reply Last reply
                2
                • H Offline
                  H Offline
                  himanshu chauhan
                  wrote on last edited by
                  #11

                  Thank you very much, it is working now.

                  1 Reply Last reply
                  0
                  • D Offline
                    D Offline
                    DevJhones
                    wrote on last edited by
                    #12

                    I have a similar problem, I wanted to change the name when installing and installing, I have an idea how to change this, I thought it was in the "Deploy" folder but I had no result

                    a3af6c66-28b2-43c6-8574-25561fcf4b70-image.png

                    ca1a0df1-32cc-4a48-b929-a273079580b1-image.png

                    1 Reply Last reply
                    0
                    • D Offline
                      D Offline
                      DevJhones
                      wrote on last edited by
                      #13

                      I managed to change it, it's inside the "qgroundcontrol.pro" file. This is for anyone who wants to change the name of the desktop application

                      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