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.2k 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 Offline
    H Offline
    himanshu chauhan
    wrote on 19 Jun 2022, 20:25 last edited by
    #1

    I had cloned a drone application's repository in Qtcreator and want to change the application's build or window name located on the top left corner of the window.

    1 Reply Last reply
    0
    • C Offline
      C Offline
      ChrisW67
      wrote on 19 Jun 2022, 21:37 last edited by ChrisW67
      #2

      I think you are talking about the title that appears on the application's main window title bar. You change that with QWidget::setWindowTitle(). If you are using Qt Creator or Designer to make the UI then the window title is accessible as a property of the main widget (and will generate code calling setWindowTitle).

      1 Reply Last reply
      1
      • H Offline
        H Offline
        himanshu chauhan
        wrote on 20 Jun 2022, 07:43 last edited by
        #3

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

        J 1 Reply Last reply 20 Jun 2022, 07:45
        0
        • H himanshu chauhan
          20 Jun 2022, 07:43

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

          J Offline
          J Offline
          jsulm
          Lifetime Qt Champion
          wrote on 20 Jun 2022, 07:45 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 20 Jun 2022, 08:13
          1
          • J jsulm
            20 Jun 2022, 07:45

            @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 20 Jun 2022, 08:13 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".

            J 1 Reply Last reply 20 Jun 2022, 08:15
            0
            • H himanshu chauhan
              20 Jun 2022, 08:13

              @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".

              J Offline
              J Offline
              jsulm
              Lifetime Qt Champion
              wrote on 20 Jun 2022, 08:15 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 20 Jun 2022, 08:37
              1
              • J jsulm
                20 Jun 2022, 08:15

                @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 20 Jun 2022, 08:37 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
                • J Offline
                  J Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on 20 Jun 2022, 08:41 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 20 Jun 2022, 08:54 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);
                    }
                    

                    }

                    J 1 Reply Last reply 20 Jun 2022, 09:01
                    0
                    • H himanshu chauhan
                      20 Jun 2022, 08:54

                      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);
                      }
                      

                      }

                      J Offline
                      J Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on 20 Jun 2022, 09:01 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 20 Jun 2022, 09:25 last edited by
                        #11

                        Thank you very much, it is working now.

                        1 Reply Last reply
                        0
                        • D Offline
                          D Offline
                          DevJhones
                          wrote on 16 Feb 2024, 13:03 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 16 Feb 2024, 13:47 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