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. unresolved external symbol "public: static struct QMetaObject const staticMetaObject"
Forum Updated to NodeBB v4.3 + New Features

unresolved external symbol "public: static struct QMetaObject const staticMetaObject"

Scheduled Pinned Locked Moved Solved General and Desktop
qt6qmetaobjectmsvc2022
26 Posts 4 Posters 4.3k Views
  • 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.
  • A a_coder

    @jsulm

    #ifndef CONTROLER_H
    #define CONTROLER_H
    
    #include <qobject.h>
    #include <qtimer.h>
    #include <qobject.h>
    #include "mainw.h"
    #include "workspace.h"
    
    
    class Timer :public QObject {
    	Q_OBJECT
    public:
    	Timer(long long &timesetup, QObject* parent = nullptr)
    		:QObject(parent)
    		,counter(new QTimer)
    	{
    		timereaining = &timesetup;
    		connect(counter, &QTimer::timeout, this, &Timer::sendupdate);
    	}
    	long long timeleft() { return *timereaining; }
    	void start() {
    		counter->setInterval(1000);
    		counter->start();
    	}
    signals:
    	void requestupdated();
    	void timeout();
    private slots:
    	void sendupdate() {
    		if (*timereaining <= 0) {
    			emit timeout();
    		}
    		else {
    			(*timereaining)--;
    			emit requestupdated();
    		}
    	}
    private:
    	long long* timereaining;
    	QTimer* counter;
    };
    
    class control :public QObject {
    	Q_OBJECT
    public:
    	control(Timer* time, QObject* parent = nullptr):
    		QObject(parent)
    		,timer(time)
    		, workspace(new Workspace(timer))
    		, mainw(new Mainw(timer))
    	{
    		/*mainw = new Mainw(timer);
    		workspace = new Workspace(timer);*/
    	}
    	~control() {
    	}
    	void start() {
    		connect(mainw, &Mainw::change_gui, this, &control::changeto_workspace_slot);
    		connect(workspace, &Workspace::change_gui, this, &control::changeto_mainw_slot);
    		mainw->start();
    	}
    //signals:
    	//void changeto_mainw();
    	//void changeto_workspace();
    private slots:
    	void changeto_mainw_slot() {
    		mainw->start();
    		workspace->close();
    	}
    	void changeto_workspace_slot() {
    		workspace->start();
    		mainw->close();
    	}
    private:
    	Timer* timer;
    	Mainw* mainw; //line 77
    	Workspace* workspace;
    };
    #endif // CONTROLER_H 
    

    sorry idk how to mark that

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

    @a_coder Please also post mainw.h

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

    1 Reply Last reply
    1
    • A a_coder

      @jsulm

      #ifndef CONTROLER_H
      #define CONTROLER_H
      
      #include <qobject.h>
      #include <qtimer.h>
      #include <qobject.h>
      #include "mainw.h"
      #include "workspace.h"
      
      
      class Timer :public QObject {
      	Q_OBJECT
      public:
      	Timer(long long &timesetup, QObject* parent = nullptr)
      		:QObject(parent)
      		,counter(new QTimer)
      	{
      		timereaining = &timesetup;
      		connect(counter, &QTimer::timeout, this, &Timer::sendupdate);
      	}
      	long long timeleft() { return *timereaining; }
      	void start() {
      		counter->setInterval(1000);
      		counter->start();
      	}
      signals:
      	void requestupdated();
      	void timeout();
      private slots:
      	void sendupdate() {
      		if (*timereaining <= 0) {
      			emit timeout();
      		}
      		else {
      			(*timereaining)--;
      			emit requestupdated();
      		}
      	}
      private:
      	long long* timereaining;
      	QTimer* counter;
      };
      
      class control :public QObject {
      	Q_OBJECT
      public:
      	control(Timer* time, QObject* parent = nullptr):
      		QObject(parent)
      		,timer(time)
      		, workspace(new Workspace(timer))
      		, mainw(new Mainw(timer))
      	{
      		/*mainw = new Mainw(timer);
      		workspace = new Workspace(timer);*/
      	}
      	~control() {
      	}
      	void start() {
      		connect(mainw, &Mainw::change_gui, this, &control::changeto_workspace_slot);
      		connect(workspace, &Workspace::change_gui, this, &control::changeto_mainw_slot);
      		mainw->start();
      	}
      //signals:
      	//void changeto_mainw();
      	//void changeto_workspace();
      private slots:
      	void changeto_mainw_slot() {
      		mainw->start();
      		workspace->close();
      	}
      	void changeto_workspace_slot() {
      		workspace->start();
      		mainw->close();
      	}
      private:
      	Timer* timer;
      	Mainw* mainw; //line 77
      	Workspace* workspace;
      };
      #endif // CONTROLER_H 
      

      sorry idk how to mark that

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

      @a_coder Btw. it is not a good idea to have more than one QObject based class in one header file - this can cause problems with moc tool.

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

      A JonBJ 2 Replies Last reply
      0
      • jsulmJ jsulm

        @a_coder Btw. it is not a good idea to have more than one QObject based class in one header file - this can cause problems with moc tool.

        A Offline
        A Offline
        a_coder
        wrote on last edited by
        #23

        @jsulm i detached it before and these are my files
        mainw.h

        #ifndef MAINW_H
        #define MAINW_H
        
        #include <qmainwindow.h>
        #include "ui_mainw.h"
        #include "control.h"
        
        class Timer;
        class control;
        
        class Mainw : public QMainWindow {
        	Q_OBJECT
        public:
        	void start();
        	Mainw(Timer* time, QWidget* parent = nullptr);
        	~Mainw();
        signals:
        	void change_gui();
        private:
        	Ui::Main* ui;
        	Timer* timer;
        private slots:
        	void updatetime();
        	void toworkspace() {
        		ui->pushButton->setDisabled(true);
        		emit change_gui();
        		this->close();
        	}
        };
        #endif // !MAINW_H
        

        workspace.h

        #ifndef WORKSPACE_H
        #define WORKSPACE_H
        
        #include <qprocess.h>
        #include <qmainwindow.h>
        #include "ui_workspace.h"
        #include "control.h"
        
        class Timer;
        
        class Workspace : public QWidget {
        	Q_OBJECT
        public:
        	Workspace(Timer* time, QWidget* parent = nullptr);
        	~Workspace();
        	void start();
        signals:
        	void change_gui();
        private:
        	//store all processes the ui run in a vector
        	std::vector<QProcess*> processes;
        	Ui::workspace* ui;
        	Timer* timer;
        private slots:
        	void updatetime();
        	void goback();
        };
        
        #endif // WORKSPACE_H
        
        jsulmJ 1 Reply Last reply
        0
        • jsulmJ jsulm

          @a_coder Btw. it is not a good idea to have more than one QObject based class in one header file - this can cause problems with moc tool.

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

          @jsulm said in unresolved external symbol "public: static struct QMetaObject const staticMetaObject":

          more than one QObject based class in one header file

          I don't want to derail this thread, but spoke to @Chris-Kawa a while ago and we both agree we have done this for years with no problems. Maybe we just don't do something "unusual/naughty/complicated".

          1 Reply Last reply
          0
          • A a_coder

            @jsulm i detached it before and these are my files
            mainw.h

            #ifndef MAINW_H
            #define MAINW_H
            
            #include <qmainwindow.h>
            #include "ui_mainw.h"
            #include "control.h"
            
            class Timer;
            class control;
            
            class Mainw : public QMainWindow {
            	Q_OBJECT
            public:
            	void start();
            	Mainw(Timer* time, QWidget* parent = nullptr);
            	~Mainw();
            signals:
            	void change_gui();
            private:
            	Ui::Main* ui;
            	Timer* timer;
            private slots:
            	void updatetime();
            	void toworkspace() {
            		ui->pushButton->setDisabled(true);
            		emit change_gui();
            		this->close();
            	}
            };
            #endif // !MAINW_H
            

            workspace.h

            #ifndef WORKSPACE_H
            #define WORKSPACE_H
            
            #include <qprocess.h>
            #include <qmainwindow.h>
            #include "ui_workspace.h"
            #include "control.h"
            
            class Timer;
            
            class Workspace : public QWidget {
            	Q_OBJECT
            public:
            	Workspace(Timer* time, QWidget* parent = nullptr);
            	~Workspace();
            	void start();
            signals:
            	void change_gui();
            private:
            	//store all processes the ui run in a vector
            	std::vector<QProcess*> processes;
            	Ui::workspace* ui;
            	Timer* timer;
            private slots:
            	void updatetime();
            	void goback();
            };
            
            #endif // WORKSPACE_H
            
            jsulmJ Offline
            jsulmJ Offline
            jsulm
            Lifetime Qt Champion
            wrote on last edited by jsulm
            #25

            @a_coder said in unresolved external symbol "public: static struct QMetaObject const staticMetaObject":

            #include "control.h"

            class Timer;
            class control;

            You have a circular dependency: mainw.h includes control.h and control.h includes mainw.h. This is not going to work. Since you only use Timer* in mainw.h and already have a forward declaration for it, the control.h include is not needed, remove it.

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

            A 1 Reply Last reply
            0
            • jsulmJ jsulm

              @a_coder said in unresolved external symbol "public: static struct QMetaObject const staticMetaObject":

              #include "control.h"

              class Timer;
              class control;

              You have a circular dependency: mainw.h includes control.h and control.h includes mainw.h. This is not going to work. Since you only use Timer* in mainw.h and already have a forward declaration for it, the control.h include is not needed, remove it.

              A Offline
              A Offline
              a_coder
              wrote on last edited by
              #26

              @jsulm it worked, thanks

              1 Reply Last reply
              0
              • A a_coder has marked this topic as solved on

              • Login

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