Nominate our 2022 Qt Champions!

QSslSocket and QThread

  • Hi,

    I am trying to get a QSslSocket to work in QThread but I cant seem to get it to work.
    The following is the code :
    // Local includes
    #include "main.h"

    // Constructor of the timer class
    Timer::Timer(QObject *parent) : QObject(parent)
    qDebug() << "inConstrutor";
    QTimer *timer = new QTimer();
    connect(timer, SIGNAL(timeout()), this, SLOT(startBackup()));

    // Start the backup
    int Timer::startBackup(){

    qDebug() << "inStart" << backingUP;
    //return 0;
        return 2;
    // Start the backup thread
    Backup *backup = new Backup();
    // Make a connection for deleting this later when done
    //connect(backup, SIGNAL(finished()), backup, SLOT(deleteLater()));
    // Set that we are running ATM
    backingUP = true;
    return 1;


    // The constructor
    Backup::Backup(QObject *parent)
    : QThread(parent)

    // This thread can never be terminated


    // The function that does everything
    void Backup::run()



    void Backup::doit(){

    qDebug() << "Doit";
    socket = new QSslSocket;
    connect(socket, SIGNAL(readyRead()),
            this, SLOT(socketReadyRead()));
    connect(socket, SIGNAL(sslErrors(QList<QSslError>)),
            this, SLOT(sslErrors(QList<QSslError>)));
    connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
            this, SLOT(socketStateChanged(QAbstractSocket::SocketState)));
    connect(socket, SIGNAL(encrypted()),
            this, SLOT(socketEncrypted()));
    // Connect to the server
    socket->connectToHostEncrypted(NSettings->value("hostname").toString(), NSettings->value("port").toInt());
    // Wait for it to reach the encryted and connected state
    if (!socket->waitForEncrypted()) {
        qDebug() << "waitForEncrypted Error";
        return; // An error occured
    // This is the protocol
    QByteArray username = NSettings->value("user").toByteArray();
    QByteArray device = NSettings->value("device").toByteArray();
    // We first need to LOGIN
    this->rite("L"+ username.toBase64() +" "+ device.toBase64());


    // Called whenever there is something to READ in the buffer
    void Backup::socketReadyRead(){

    qDebug() << socket->bytesAvailable();
    QString str = socket->readAll();
    qDebug() << str;
    bool unconnected = !socket || socket->state() == QAbstractSocket::UnconnectedState;
    if(str == "LOGIN SUCCESSFUL"){
        for(int i = 1; i <= 1000; i++){
            // Was the login successful ?
                qDebug() << socket->state();
            this->rite("STORE ABC\r\n");
    qDebug() << "End READ";
    // Disconnect from the server


    // Called when the connection is fully established
    void Backup::socketEncrypted()
    qDebug() << "Connection Established";

    // Called when there are SSL errors
    void Backup::sslErrors(const QList<QSslError> &errors)
    foreach (const QSslError &error, errors){
    qDebug() << error.errorString();

    // Ignore Errors


    // Whenever there is a change in the connection STATE, this is called
    void Backup::socketStateChanged(QAbstractSocket::SocketState state)
    qDebug() << state;

    // Socket write safe as it appends the length to the beginning of the string
    qint64 Backup::rite(const QByteArray & data)
    return socket->write(data);

    When I run this I get the following error :
    inStart false
    QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketState'
    (Make sure 'QAbstractSocket::SocketState' is registered using qRegisterMetaType().)
    waitForEncrypted Error

    If I dont call the backup->start(); and call the backup->doit(); then the code works perfectly.
    I would really be happy, if someone can shed any light on what I am doing wrong.

Log in to reply