Qt -- Klasa pochodna po QListWidgetItem

0

Potrzebuje obiekty, które będę mógł wyświetlić w QListWidget.

Najlepszym sposobem powinno być stworzenie klasy dziedziczącej po QListWidgetItem rozszerzając ją o pola właściwe dla danego typu maszyny (pasażerski/transportowy) . Potrzebne mi są jako obiekty maszyn, które obsługuje program lotniska/pasu startowego.

#ifndef CPASAZERSKI_H
#define CPASAZERSKI_H
#include "csamolot.h"
#include <QListWidgetItem>
#include <QString>


class CPasazerski : public QListWidgetItem
{
public:
    CPasazerski(QListWidget*);
    CPasazerski(const QString&, QListWidget*, int type);

private:
    qint32 iloscPasazerow;
    QString miejsceDocelowe;
    QString liniaLotnicza;
};

#endif // CPASAZERSKI_H 
#include "cpasazerski.h"
#include <QListWidgetItem>

CPasazerski::CPasazerski(QListWidget * parent = 0) : QListWidgetItem(parent)
{}

CPasazerski::CPasazerski(const QString &text, QListWidget *parent = 0, int type = Type) : QListWidgetItem(&text)
{}
 

Mam problem już z samymi konstruktorami. Nie mogę stworzyć obiektu np:. "CPasazerski samolot("luthansa")" wyskakuje że nie ma matching function, chociaż tak na oko jest przecież QString &text.

Czego tu brakuje?

0

tak wyglądają konstruktory dziedziczonej klasy QListWidgetItem:

QListWidgetItem(QListWidget * parent = 0, int type = Type)
QListWidgetItem(const QString & text, QListWidget * parent = 0, int type = Type) 
1

Problemem nie jest przypadkiem to, że próbujesz przekazać adres tutaj w konstruktorze klasy bazowej zamiast samej zmiennej CPasazerski::CPasazerski(const QString &text, QListWidget *parent = 0, int type = Type) : QListWidgetItem(&text) ? Powinno być bez & (konstruktor bazowy).

0

faktycznie chodzi o to. Choć wcześniej próbowałem już bez tego ampersanda, ale musiałem mieć jeszcze inny błąd gdzie indziej.

Natomiast pojawiło się teraz takie ustrojstwo:

błąd:duplicate section `.rdata$_ZTI11CPasazerski[__ZTI11CPasazerski]' has different size 

jak kliknę w ten błąd to otwiera mi plik cpasazerski.o a w nim wszystko zapisane cyferkami.. :?

0

Czy to się tylko pojawia gdy zmieniasz z referencji na zmienną?

0

No to już jest przesada. Po usunięciu ampersanda skompilowało się z tym błędem co wkleiłem. Spróbowałem zastosować się do rady Dragona i dopisałem Qstring("luthansa") co niestety spowodowało powrót do tego samego co wcześniej. Ale co najlepsze, kiedy cofnąłem tą zmianę, (czyli wersja tylko bez ampersana) to teraz pojawia się

błąd:no matching function for call to 'CPasazerski::CPasazerski(const char [8])' 

, którego wcześniej nie było!

I teraz to już nie wiem.

Ale na trzeźwo, poprawka Dragona musi być słuszna, bo same cudzysłowy to faktycznie jest char[], chociaż z drugiej strony konstruktor konwertujący chyba powinien zadziałać w tym momencie? No ale ta postać:

CPasazerski samolot(QString("samolot"));

wywala : no matching function for call to 'CPasazerski::CPasazerski(QString)' , tak więc pytanie jest, jak zrobić żeby przekazać tego QStringa w formie referencji??

1

Problem jest śmiesznie prosty. Wartości domyślne funkcji powinny się znajdować w pliku nagłówkowym, a nie w pliku źródłowym.
Twój plik nagłówkowy powinien wyglądać tak:

#ifndef CPASAZERSKI_H
#define CPASAZERSKI_H

#include <QListWidgetItem>
 
class CPasazerski : public QListWidgetItem
{
public:
    explicit CPasazerski(QListWidget *parent=0); //  tu musi  być słowo explicit
    CPasazerski(const QString&, int type = 0, QListWidget* parent=0); // wlasciciel powinien byc na koncu
 
private:
    qint32 iloscPasazerow;
    QString miejsceDocelowe;
    QString liniaLotnicza;
};
 
#endif // CPASAZERSKI_H 
0

A podpowiecie mi, gdzie umieścić główną pętle programu, nie GUI tylko własną pętlę programu? Konstruktor obiektu MainWindow to chyba nie jest to miejsce?

0

Jeżeli własną która coś tam ma robić innego to w oddzielnym wątku.

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