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 declare global variable in QT?
Forum Updated to NodeBB v4.3 + New Features

How to declare global variable in QT?

Scheduled Pinned Locked Moved Solved General and Desktop
13 Posts 4 Posters 3.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.
  • T Offline
    T Offline
    TomNow99
    wrote on last edited by
    #1

    Hello,

    I know that my question is not stricte about QT, but about c++ ( or programming ) , but in this project I use QT.

    So I would like to create something like std::cout. I have to only add iostream library and in every place I can write std::cout<<something.

    I would like to start with something easier, so I would like to have global int.

    I created class:

    #ifndef DEB_H
    #define DEB_H
    
    extern int x;
    
    class deb
    {
    public:
        deb();
    };
    
    #endif // DEB_H
    
    #include "deb.h"
    
    int x=4;
    
    deb::deb()
    {
    
    }
    
    

    and add this class to mainWindow. In mainWindow I try do:

    qDebug()<<x;
    

    But I have error: reference to non-static member function must be called. Where I did wrong?

    JonBJ 1 Reply Last reply
    0
    • Christian EhrlicherC Online
      Christian EhrlicherC Online
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #4

      @TomNow99 said in How to declare global variable in QT?:

      I don't have other x function or variable.

      You have: https://doc.qt.io/qt-5/qwidget.html#x-prop

      Use ::x - but it's c++ basics I would guess and has nothing to do with Qt :)

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      1 Reply Last reply
      3
      • Christian EhrlicherC Online
        Christian EhrlicherC Online
        Christian Ehrlicher
        Lifetime Qt Champion
        wrote on last edited by
        #2

        So did you include deb.h where you want to use x? Also are you sure you don't have a function named x() in this class?
        And please avoid global variables - they are not needed in most cases.

        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
        Visit the Qt Academy at https://academy.qt.io/catalog

        1 Reply Last reply
        1
        • T Offline
          T Offline
          TomNow99
          wrote on last edited by
          #3

          @Christian-Ehrlicher Thank you for answer. In last post I paste all my deb class code.

          Here is my mainWindow code:

          #ifndef MAINWINDOW_H
          #define MAINWINDOW_H
          
          #include <QMainWindow>
          #include "deb.h"
          QT_BEGIN_NAMESPACE
          namespace Ui { class MainWindow; }
          QT_END_NAMESPACE
          
          class MainWindow : public QMainWindow
          {
              Q_OBJECT
          
          public:
              MainWindow(QWidget *parent = nullptr);
              ~MainWindow();
          
          private:
              Ui::MainWindow *ui;
          };
          #endif // MAINWINDOW_H
          
          #include "mainwindow.h"
          #include "ui_mainwindow.h"
          #include <QDebug>
          MainWindow::MainWindow(QWidget *parent)
              : QMainWindow(parent)
              , ui(new Ui::MainWindow)
          {
              ui->setupUi(this);
              qDebug()<<x;
          }
          
          MainWindow::~MainWindow()
          {
              delete ui;
          }
          

          I don't have other x function or variable.

          1 Reply Last reply
          0
          • Christian EhrlicherC Online
            Christian EhrlicherC Online
            Christian Ehrlicher
            Lifetime Qt Champion
            wrote on last edited by
            #4

            @TomNow99 said in How to declare global variable in QT?:

            I don't have other x function or variable.

            You have: https://doc.qt.io/qt-5/qwidget.html#x-prop

            Use ::x - but it's c++ basics I would guess and has nothing to do with Qt :)

            Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
            Visit the Qt Academy at https://academy.qt.io/catalog

            1 Reply Last reply
            3
            • T Offline
              T Offline
              TomNow99
              wrote on last edited by
              #5

              @Christian-Ehrlicher It was.... Wow :D Thank you very much! Yes, x and y is position :D Thank you!

              1 Reply Last reply
              0
              • T TomNow99

                Hello,

                I know that my question is not stricte about QT, but about c++ ( or programming ) , but in this project I use QT.

                So I would like to create something like std::cout. I have to only add iostream library and in every place I can write std::cout<<something.

                I would like to start with something easier, so I would like to have global int.

                I created class:

                #ifndef DEB_H
                #define DEB_H
                
                extern int x;
                
                class deb
                {
                public:
                    deb();
                };
                
                #endif // DEB_H
                
                #include "deb.h"
                
                int x=4;
                
                deb::deb()
                {
                
                }
                
                

                and add this class to mainWindow. In mainWindow I try do:

                qDebug()<<x;
                

                But I have error: reference to non-static member function must be called. Where I did wrong?

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by JonB
                #6

                @TomNow99
                If in your deb.h file you show you have int x=4; in addition to extern int x;, then at least when you include that into multiple .cpp files you will end up with "multiple definitions of x variable" when you link. Definitions/initializations of "global" variables belong in one .cpp file, not in a .h file. EDIT Ah perhaps you are already doing this, I can't figure where what you show is situated.

                OK, I see what is @Christian-Ehrlicher is spotting. One obvious conclusion: if you are going to have "global" variables, don't name them anything like x!!

                1 Reply Last reply
                1
                • T Offline
                  T Offline
                  TomNow99
                  wrote on last edited by
                  #7

                  @JonB When I delete this line "extern int x" from deb.h I have error in mainWindow "use of undeclared identifier xx".

                  JonBJ 1 Reply Last reply
                  0
                  • T TomNow99

                    @JonB When I delete this line "extern int x" from deb.h I have error in mainWindow "use of undeclared identifier xx".

                    JonBJ Offline
                    JonBJ Offline
                    JonB
                    wrote on last edited by JonB
                    #8

                    @TomNow99
                    Of course, why would you delete the extern?? As I said, I was talking about the int x = 4 line, which I (at least originally) thought was in your deb.h. If that is in a .cpp and not a .h then you are fine....

                    1 Reply Last reply
                    1
                    • T Offline
                      T Offline
                      TomNow99
                      wrote on last edited by
                      #9

                      @JonB @Christian-Ehrlicher I have one more question.

                      I need only one thing to have everything, what I would like.

                      When I look at std::cout I can use it everywhere ( of course when I include iostream library ), but I can't create next std::ostream object ( because of protected constructor ). I would like the same in my project ( can't create other than that global object ).

                      But when I change public to private constructor of my class, I will not create object in deb.cpp ( here I would like to create my object. Only here! ). I know that I can create some function singleton, but I would like that trick, which is in iostream and cout.

                      So I would like have:

                      #ifndef DEB_H
                      #define DEB_H
                      
                      class deb
                      {
                      private:
                          deb();
                      };
                      
                      extern deb xx;
                      #endif // DEB_H
                      

                      and

                      #include "deb.h"
                      
                      deb xx; // error - constructor is private
                      
                      deb::deb()
                      {
                      
                      }
                      
                      1 Reply Last reply
                      0
                      • Christian EhrlicherC Online
                        Christian EhrlicherC Online
                        Christian Ehrlicher
                        Lifetime Qt Champion
                        wrote on last edited by
                        #10

                        You mix something up - std::cout is no std::ostream - it's a global object which takes a std::ostream via the << operator.
                        std::ostream is a base class of the different output possibilities like iostream or ofstream.

                        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                        Visit the Qt Academy at https://academy.qt.io/catalog

                        1 Reply Last reply
                        1
                        • T Offline
                          T Offline
                          TomNow99
                          wrote on last edited by TomNow99
                          #11

                          @Christian-Ehrlicher Here:

                          https://en.cppreference.com/w/cpp/io/cout

                          I see ( on the top ):

                          extern std::ostream cout;
                          

                          EDIT:
                          So I tried create std::ostream cout2; and I can't

                          EDIT2:
                          So cout is object of class... ? Which one?

                          jsulmJ 1 Reply Last reply
                          0
                          • T TomNow99

                            @Christian-Ehrlicher Here:

                            https://en.cppreference.com/w/cpp/io/cout

                            I see ( on the top ):

                            extern std::ostream cout;
                            

                            EDIT:
                            So I tried create std::ostream cout2; and I can't

                            EDIT2:
                            So cout is object of class... ? Which one?

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

                            @TomNow99

                            extern std::ostream cout;
                            

                            declares a variable, so an instance/object.

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

                            1 Reply Last reply
                            0
                            • T Offline
                              T Offline
                              TomNow99
                              wrote on last edited by
                              #13

                              @jsulm Yes, but here I see that cout is object of std::sotream class.

                              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