C++ QT Creator Nie mogę użyć dziedziczenia QThread

0

Witam, zaczynam swoją przygodę z QT i chciałbym aby pętla while wykonująca się dopóki zostanie nawiązane połączenie (sprawdzanie wartości zwracanej przez ping) działała w inny wątku, ponieważ obecnie nie wyświetla okna dopóki się nie połączę. Gdy do klasy mainwindow dodaje dziedziczenie QThread kompilator wyświetla poniższe błędy, jak mogę rozwiązać ten problem? Z góry dziękuję za pomoc.

 'QObject' is an ambiguous base of 'MainWindow'
         MainWindow *_t = static_cast<MainWindow *>(_o);
                                                      ^
'QObject' is an ambiguous base of 'MainWindow'
     return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
                     ^
'QObject' is an ambiguous base of 'MainWindow'
     return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
                                                  ^ 

'QObject' is an ambiguous base of 'MainWindow'
             qt_static_metacall(this, _c, _id, _a);
                                                 ^ 
class MainWindow : public QMainWindow, system_chck, QThread 
2

Klasa MainWindow jak nazwa sugeruje reprezentuje główne okno aplikacji. Niech sprawdzaniem połączenia zajmuje się inna klasa. Poczytaj dokumentację klasy QThread, masz tam wyjaśnione jak wykonywać jakiś kod w osobnym wątku. Wcale nie potrzebujesz dziedziczenia z klasy QThread.

2

Dziedziczenie QThread jest niewskazane: https://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/

Ogółem, Twój problem brzmi jak idealne zastosowanie dla sygnałów i slotów Qt, a nie wciskania na siłę wielowątkowości.

0

Dziękuję za odpowiedź, zrobiłem więc w sygnale, ale wyświetla niestety poniższy błąd:
QObject::connect: Cannot connect (null)::ping_result(int) to MainWindow::onping_result(int)

 #ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QThread>
#include "system_chck.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    void cos();
    void run();
    ~MainWindow();

private slots:
    void on_connection_status_linkActivated(const QString &link);

    void on_label_objectNameChanged(const QString &objectName);

    void onping_result(int);

private:
    Ui::MainWindow *ui;
    system_chck *system_chck_wsk;
};

#endif // MAINWINDOW_H
#ifndef SYSTEM_CHCK_H
#define SYSTEM_CHCK_H
#include <QThread>
#include <QDialog>
#include <QMainWindow>

class system_chck: public QDialog
{
    Q_OBJECT
    int ping;


public:
int state;

    int network_chck();

signals:
    void ping_result(int);
};

#endif
 
 #include "mainwindow.h"
#include "ui_mainwindow.h"
#include "system_chck.h"
#include <unistd.h>
#include <QThread>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
  
connect(system_chck_wsk,SIGNAL(ping_result(int)),this,SLOT(onping_result(int)));
}

MainWindow::~MainWindow()
{

    delete ui;

}

void MainWindow::cos()
{
}

void MainWindow::onping_result(int state)
{
     while(true) //sprawdzanie polaczenia internetowego
    {
         if(state == 0)
         {
             ui->label -> setText("Nawiazano polaczenie!");
            break;
         }
         else
         {
         ui->label -> setText("Brak polaczenia!");
         sleep(3);
     }
}
}

void MainWindow::on_connection_status_linkActivated(const QString &link)
{



}

void MainWindow::on_label_objectNameChanged(const QString &objectName)
{

}

#include "system_chck.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <unistd.h>

int system_chck::network_chck()
{

    ping = system("ping -c1 google.com >&-");
    state=WEXITSTATUS(ping); //stan zwracany przez komende ping
    //return state;
    emit ping_result(state);
}
 

Widzicie może gdzie błąd popełniłem? Na razie ma pobrać tylko wartość zwracaną przez ping.

1

QObject: Cannot connect (null)::ping_result(int) to MainWindow::onping_result(int)

Pogrubiłem istotną część. W momencie gdy tworzysz okienko system_chck_wsk nie jest ustawiony.

Przy okazji system("ping -c1 google.com >&-") nie zwróci raczej tego, czego oczekujesz.

0

Ping zwraca co trzeba, 0 w wypadku nawiązania połączenia, lub inną wartość gdy nie połączę.

0

W mainwindow.cpp dodałem poniższe linijki, tamtego błędu już nie wyświetla, ale niestety nic nie przekazuje.

  system_chck_wsk = new system_chck();
  system_chck_wsk -> network_chck(); 
2

W funkcji MainWindow::onping_result masz nieskończoną pętle, która freezuje okno aplikacji.
I w którym miejscu wstawiłeś te dwie linijki? W konstruktorze? Jak aktualnie on wygląda?

0

Właśnie ta pętla powodowała że przy braku połączenia itnernetowego nie otwiera się okno, chciałem ja przenieść do klasy system_chck i przekazywać tylko do mainwindow zwracaną wartość, ale to chyba wyjdzie na to samo, więc muszę pomyśleć nad innym rozwiązaniem pingowania dopóki nie połączy. Aczkolwiek mimo wszystko muszę opanować wykorzystanie sygnałów i slotów. Poniżej mainwindow.cpp z dodanymi linijkami właśnie w konstruktorze:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "system_chck.h"
#include <unistd.h>
#include <QThread>
#include <iostream>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
//    system_chck sp1;
 //   sp1.network_chck();

   **system_chck_wsk = new system_chck();
    system_chck_wsk -> network_chck();**
connect(system_chck_wsk,SIGNAL(ping_result(int)),this,SLOT(onping_result(int)));
//ui->label -> setText("Test");
}

MainWindow::~MainWindow()
{

    delete ui;

}

void MainWindow::cos()
{
}

void MainWindow::onping_result(int state)
{
   //  while(true) //sprawdzanie polaczenia internetowego
 //   {
         if(state == 0)
         {
             ui->label -> setText("Nawiazano polaczenie!");
           // break;
         }
         else
         {
         ui->label -> setText("Brak polaczenia!");
         sleep(3);
     }
//}
}

void MainWindow::on_connection_status_linkActivated(const QString &link)
{



}

void MainWindow::on_label_objectNameChanged(const QString &objectName)
{

}

 
0

Problem rozwiązany, wystarczyło przenieść linjkę system_chck_wsk -> network_chck(); pod connect.

1 użytkowników online, w tym zalogowanych: 0, gości: 1