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. QWebSocket wont connect or give error
Forum Updated to NodeBB v4.3 + New Features

QWebSocket wont connect or give error

Scheduled Pinned Locked Moved Solved General and Desktop
15 Posts 3 Posters 2.4k 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.
  • K Kris Revi

    @mrjj i am not sure! first time touching Qt C++ ! i've done this in PyQt5 Python but yea

    it doesn't seem to connect at all! it just spits out the qDebug message WebSocket server: QUrl("ws://192.168.10.122:80")

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

    @Kris-Revi said in QWebSocket wont connect or give error:

    @mrjj i am not sure! first time touching Qt C++ ! i've done this in PyQt5 Python but yea

    In your PyQt5, did you do same client = MySocket (...) where client was just a local label in a method; or did you do a self.client = MySocket (...), or pass a parent? Because @mrjj is right, and you will have to be even more careful about scope in C++ than in Python....

    K 1 Reply Last reply
    1
    • JonBJ JonB

      @Kris-Revi said in QWebSocket wont connect or give error:

      @mrjj i am not sure! first time touching Qt C++ ! i've done this in PyQt5 Python but yea

      In your PyQt5, did you do same client = MySocket (...) where client was just a local label in a method; or did you do a self.client = MySocket (...), or pass a parent? Because @mrjj is right, and you will have to be even more careful about scope in C++ than in Python....

      K Offline
      K Offline
      Kris Revi
      wrote on last edited by
      #6

      @JonB yea i did self.client so yea difference here is local vs class member :P

      so i added MySocket Socket; to mainwindow.h header file

      but how do i now call that

      MySocket client(QUrl(QStringLiteral("ws://%1:80").arg(selected_board)), true);
      

      if i do

      Socket(QUrl(QStringLiteral("ws://%1:80").arg(selected_board)), true);
      

      i get type 'MySocket' does not provide a call operator

      1 Reply Last reply
      0
      • K Offline
        K Offline
        Kris Revi
        wrote on last edited by
        #7

        so i did it like this

        // =========================================================================================================== //
        // CONSTRUCTOR
        // =========================================================================================================== //
        MySocket::MySocket(QObject *parent) : QObject(parent)
        {
            connect(&m_webSocket, &QWebSocket::connected, this, &MySocket::onConnected);
            connect(&m_webSocket, &QWebSocket::disconnected, this, &MySocket::closed);
            connect(&m_webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error), [=](QAbstractSocket::SocketError error)
            {
               qDebug() << "[ERROR][SOCKET] " << error;
            });
            
        }
        
        // =========================================================================================================== //
        // Socket Connected
        // =========================================================================================================== //
        void MySocket::doConnect(QString URL)
        {
            qDebug() << "WebSocket server:" << URL;
            m_webSocket.open(QUrl(URL));
        }
        

        i moved the .open part to it's own function and called it from Socket.doConnect(selected_board);

        but i get an error (atleast something)

        WebSocket server: "192.168.10.122"
        [ERROR][SOCKET]  QAbstractSocket::UnsupportedSocketOperationError
        
        1 Reply Last reply
        0
        • mrjjM mrjj

          @Kris-Revi
          Hi
          well since its a variable in a function it will be deleted as soon as function ends.
          So that might happen really fast before it get chance to signal anything else.

          Try having
          MySocket client; as a member and not as a local variable.
          and see if that helps.

          you can also do
          void connectTo()
          {
          MySocket* client= new MySocket (QUrl(QStringLiteral("ws://192.168.10.122:80")), true);
          }

          but its a memory leak but fine to test if that is indeed the issue.
          (killed by scope)

          K Offline
          K Offline
          Kris Revi
          wrote on last edited by
          #8

          @mrjj you know? :)

          mrjjM 1 Reply Last reply
          0
          • K Kris Revi

            @mrjj you know? :)

            mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by
            #9

            @Kris-Revi
            Hi
            It can say this error if you ask it to do something while connecting state but i dont see code that would do it.

            K 1 Reply Last reply
            0
            • mrjjM mrjj

              @Kris-Revi
              Hi
              It can say this error if you ask it to do something while connecting state but i dont see code that would do it.

              K Offline
              K Offline
              Kris Revi
              wrote on last edited by
              #10

              @mrjj so what i do is this (keep in mind the code above)

              void MainWindow::findIP(QString Key)
              {
                  auto key = Key;
                      if ( board.count(key) ) {
                          DeviceInfo &di = board[key];
                          connectTo( di.ip );
                      }
                      else
                      {
                          qDebug() << "[ERROR][STRUCT] Did not find key using the word : " << Key;
                      }
              }
              
              // This is a button bind on clicked (one of the Devices) triggers the function above
              void MainWindow::on_BUTTON_STUDIOLIGHT_clicked() { findIP("Studio Lights"); }
              
              // This is function that gets called from findIP function todo the connection with socket
              void MainWindow::connectTo(QString selected_board)
              {
                  Socket.doConnect(selected_board);
              }
              

              and this is the MySocket.cpp file

              // =========================================================================================================== //
              // INCLUDE
              // =========================================================================================================== //
              #include "MySocket.h"
              #include <QDebug>
              
              QT_USE_NAMESPACE
              
              // =========================================================================================================== //
              // CONSTRUCTOR
              // =========================================================================================================== //
              MySocket::MySocket(QObject *parent) : QObject(parent)
              {
                  connect(&m_webSocket, &QWebSocket::connected, this, &MySocket::onConnected);
                  connect(&m_webSocket, &QWebSocket::disconnected, this, &MySocket::closed);
                  connect(&m_webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error), [=](QAbstractSocket::SocketError error)
                  {
                     qDebug() << "[ERROR][SOCKET] " << error;
                  });
                  
              }
              
              // =========================================================================================================== //
              // Socket Connected
              // =========================================================================================================== //
              void MySocket::doConnect(QString URL)
              {
                  qDebug() << "WebSocket server:" << URL;
                  m_webSocket.open(QUrl(URL));
              }
              // =========================================================================================================== //
              // Socket On Connected
              // =========================================================================================================== //
              void MySocket::onConnected()
              {
                  if (m_debug)
                      qDebug() << "WebSocket connected";
              }
              // =========================================================================================================== //
              // Send Message (For Strips)
              // =========================================================================================================== //
              void MySocket::sendCommandStrip(const QString &bName, int bValue)
              {
                  m_webSocket.sendTextMessage(QStringLiteral("{%0:%1}").arg(bName).arg(bValue));
              }
              // =========================================================================================================== //
              // Send Message (For Matrix)
              // =========================================================================================================== //
              void MySocket::sendCommandMatrix(QString bValue)
              {
                  m_webSocket.sendTextMessage(bValue);
              }
              // =========================================================================================================== //
              // Socket Close
              // =========================================================================================================== //
              void MySocket::close()
              {
                  m_webSocket.close();
              }
              
              1 Reply Last reply
              0
              • mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by
                #11

                Hi
                It looks fine but i wonder i QUrl likes an IP as that is what you give it.
                Also those IPs. could that request HTTPS so that you need SSL compiled and enabled ?

                K 2 Replies Last reply
                0
                • mrjjM mrjj

                  Hi
                  It looks fine but i wonder i QUrl likes an IP as that is what you give it.
                  Also those IPs. could that request HTTPS so that you need SSL compiled and enabled ?

                  K Offline
                  K Offline
                  Kris Revi
                  wrote on last edited by
                  #12

                  @mrjj i found out why!

                  Original :

                  Socket.doConnect(selected_board);
                  

                  Now :

                  Socket.doConnect(QStringLiteral("ws://%1:80").arg(selected_board));
                  
                  1 Reply Last reply
                  1
                  • mrjjM mrjj

                    Hi
                    It looks fine but i wonder i QUrl likes an IP as that is what you give it.
                    Also those IPs. could that request HTTPS so that you need SSL compiled and enabled ?

                    K Offline
                    K Offline
                    Kris Revi
                    wrote on last edited by
                    #13

                    @mrjj how do i do this in Qt C++

                    Python (custom Qt Signal)

                    error = pyqtSignal(QtNetwork.QAbstractSocket.SocketError)
                    

                    so that i can hookup error and connected signal to slots in mainwindow.cpp :)

                    1 Reply Last reply
                    0
                    • K Offline
                      K Offline
                      Kris Revi
                      wrote on last edited by
                      #14

                      I've put onError and onConnected under Q_SIGNALS: in the MySocket.h in the class!

                      now what?

                      mrjjM 1 Reply Last reply
                      0
                      • K Kris Revi

                        I've put onError and onConnected under Q_SIGNALS: in the MySocket.h in the class!

                        now what?

                        mrjjM Offline
                        mrjjM Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on last edited by
                        #15

                        @Kris-Revi

                        Hi
                        Then you have defined 3 new signals for your class.
                        Another class could now use the connect statement to
                        hook up a slot to your new signals.

                        However, for something to happen.
                        You must use

                        emit onConnected(); 
                        

                        somewhere in your code to actually "send" the signal
                        at the right times.

                        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