Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

a main window class for console app - non GUI



  • at the moment I have this

    int main(int argc, char *argv[]) {
    
    	QCoreApplication a(argc, argv);
    
    	myServer server;
    	server.listen(adr, port);
    
        return a.exec();
    }
    
    

    and I wish to move this bit

    atpTcpServer server;
    server.listen(adr, port);
    

    to a class - separate files myClass.h / myClass.cpp

    #ifndef MYCLASS_H
    #define MYCLASS_H
    
    #include <QObject>
    
    #include <myServer.h>
    
    class myClass : public QObject {
    		Q_OBJECT
    
    	public:
    		explicit myClass(QObject *parent = nullptr);
    
    	signals:
    		void quit();
    
    	public slots:
    		void startAll();
    		void quitApp();
    
    	private slots:
    		void initIni();
    		bool initSQL();
    		void initServer();
    
    	private:
    		myServer server;
    
    };
    
    #endif 
    

    that is the h file and the c++ is the following

    #include "myClass.h"
    
    atpCommandsProcessing::atpCommandsProcessing(QObject *parent) : QObject(parent) {
    
    }
    
    void atpCommandsProcessing::startAll() {
    	initServer(); //start the server and some other stuff here
    
    }
    
    void atpCommandsProcessing::quitApp() {
    	emit quit();
    }
    
    void myClass::initServer() {
    	
    
    }
    
    

    and as soon as my main.cpp becomes like that

    int main(int argc, char *argv[]) {
    
        QCoreApplication a(argc, argv);
    
    	myClass myComPro;
    	myComPro.startAll();
    
        return a.exec();
    }
    
    

    after that my servers start but shortly after is destroyed.. why??? I think that my class is not in the event loop?? I wish to be like mainwindow class for the GUI sistem.. how can I do that?? to have a main window where to process everything and that not to be in main.cpp
    is that possible in Qt?? - hope it is...
    any advice??

    Many thanks


  • Moderators

    Yes it is possible and your code looks correct, at least the part that you have shared.

    Some things to remember:

    • even loop starts in a.exec(). It is not running yet when you call myComPro.startAll()
    • if you want to start your code after even loop, use QTimer::singleShot(0, [&myComPro]() {myComPro.startAll()})
    • app won't quit until you stop the even loop (a.quit())

  • Moderators

    @sierdzio actually how does QCoreApplication behave, on default, when no Widget is opened before the event loop?

    I would assume, lastWindowClosed() is emitted. -> closing the application ?


  • Moderators

    @J.Hilk said in a main window class for console app - non GUI:

    I would assume, lastWindowClosed() is emitted. -> closing the application ?

    Q Core Application ;-) No such signal there.


  • Moderators

    @sierdzio
    x) my bad



  • @sierdzio said in a main window class for console app - non GUI:

    Yes it is possible and your code looks correct, at least the part that you have shared.

    Some things to remember:

    • even loop starts in a.exec(). It is not running yet when you call myComPro.startAll()
    • if you want to start your code after even loop, use QTimer::singleShot(0, [&myComPro]() {myComPro.startAll()})
    • app won't quit until you stop the even loop (a.quit())

    I've just tried that and is giving me this

    QEventLoop: Cannot be used without QApplication
    atpTCPRunnable(0x555b6e1ba7c0) started on  QThread(0x555b6e1bae40, name = "Thread (pooled)")
    QEventLoop: Cannot be used without QApplication
    
    

    where should I use the Qapplication?? should I do the myComPro en extent of it??


  • Moderators

    You have to put that timer after QCoreApplication a(argc, argv);.



  • @sierdzio of course - this is what I've done but that was the error..


  • Moderators

    @arsinte_andrei can you please copy and paste your exact main.cpp ?



  • I've even tried
    QMetaObject::invokeMethod( &comPro, "startAll", Qt::QueuedConnection );



  • @J.Hilk yes here you have it a working one in the main.cpp

    #include <QtCore>
    #include <QCoreApplication>
    #include <QtDebug>
    #include <QFile>
    #include <QTextStream>
    #include <QtGlobal>
    #include <stdio.h>
    #include <stdlib.h>
    #include <QDebug>
    
    #include <atpcommandsprocessing.h>
    
    
    int main(int argc, char *argv[]) {
    
    	//TODO qInstallMessageHandler have to be enabled at the end
    	//	qInstallMessageHandler(myMessageOutput); // Install the handler
    
    	QCoreApplication::setOrganizationName("@atp@");
    	QCoreApplication::setOrganizationDomain("arsinte.co.uk");
    	QCoreApplication::setApplicationName("atpServerSmartHomeSystem");
    
        QCoreApplication a(argc, argv);
    
    //	atpCommandsProcessing myComPro;
    //	myComPro.startAll();
    
    
    	atp_Ini atpInf;
    
    	QHostAddress adr = QHostAddress::Any;
    	adr.setAddress(atpInf.get_ServerAddress());
    	atpTcpServer server;
    	server.setMode(static_cast<atpTcpServer::ThreadMode>( atpInf.get_ThreadMode()));
    	server.setMaxConnections(atpInf.get_maxConnections());
    	server.setConnectionTimeout(atpInf.get_timeOut());
    	server.listen(adr, atpInf.get_ServerPortNo());
    
    //	QTimer::singleShot(0, [&myComPro]() {myComPro.startAll();});
    
    //	QObject::connect(&myComPro, &atpCommandsProcessing::quit, &a, &QCoreApplication::quit);
    
    
        return a.exec();
    }
    
    


  • Oh.. sorry ... I'm so stupid...
    in my function * startAll* I had

    atpTcpServer server;
    

    and as soon as the function finished even the server was closed... I've moved that declaration to the h file in private declarations and everything is working perfectly....

    many Thanks to everyone - especially to @sierdzio

    God bless


  • Moderators

    No problem, it happens to everybody sometimes :-) Happy coding!


Log in to reply