programowanie obiektowe

0

Witam!

Jestem w trakcie implementowania pewnego algorytmu matematycznego w języku C++, wybrałem jako IDE środowisko QT Creator. Najwięcej problemów sprawia mi jednak programowanie obiektowe, bo przede wszystkim miałem jednak do czynienia z językiem Visual Basic, w którym to żadnych klas nie tworzyłem. No a tutaj jeszcze trochę sprawa się komplikuje, bo klasy w QT są trochę inne, niż w "zwykłym" C++. Stąd też byłbym wdzięczny za jakieś wskazówki, w miarę jak będę kodował i będą się pojawiać pewne niejasności czy problemy, których nie uda mi się rozwiązać.

Otóż do nowoutworzonego projektu dodałem przy pomocy kreatora klasę, a dokładniej to jej dwa pliki, mydata.h i mydata.cpp. Ta klasa ma przechowywać dane matematyczne w postaci macierzy i paru innych zmiennych, a także metody (funkcje) wykonywane na danych. Natomiast w pliku mainwindow.cpp znajduje się funkcja on_pushButton_clicked, odpowiedzialna za wywołanie funkcji zwracającej zmienną plikową, później konstruktora klasy myData (przekazując mu tą zmienną plikową), a następnie akcesorów tej klasy.

  1. Potrzebuję stworzyć dwuwymiarową tablicę elementów typu integer w dynamiczny sposób, tzn. nie znając z góry rozmiarów tablicy. Jest ona wymiarów n x n, gdzie n jest pobierane z pliku. Pomyślałem, że można to zrealizować przy pomocy QList. Niestety, w pomocy (http://doc.qt.nokia.com/latest/qlist.html) nie widzę żadnej informacji, jak później operować na czymś w rodzaju:

QList<QList<int> > myMatrix;

a dokładniej: przypisać element[x][y]; później go przeczytać; zniszczyć na końcu myMatrix, jak nie będzie potrzebne.

  1. Jeśli wykonam kod (w pliku mainwindow.cpp)

void MainWindow::on_pushButton_clicked()
{
ui->labelTmp->setText("tekst");

to wszystko jest w porządku. Natomiast ten sam kod w domyślnym konstruktorze klasy, w pliku myData.cpp powoduje błąd:

In constructor 'myData::myData(QWidget*)':
'ui' was not declared in this scope
D:\Qt\2010.05\tmp01-build-desktop..\tmp01\mydata.cpp

Nie wiem, jak zadeklarować 'ui', albo może raczej, jak poinformować kod, że 'ui' zostało zadeklarowane w odpowiednim miejscu.

Pozdrawiam!

1

odwoływać się do widget'ów na formularzu możesz dopiero po wywołaniu "ui->setupUi(this);", które powinno znaleźć się w konstruktorze klasy.

0

Dzięki wielkie za odpowiedź!
Czy wiesz może jeszcze, jak odwoływać się do dwuwymiarowej tablicy dynamicznej w oparciu o kontenery (jak to opisałem w pierwszym pytaniu)?
Pozdrawiam!

1
johnyjj2 napisał(a)

Dzięki wielkie za odpowiedź!
Czy wiesz może jeszcze, jak odwoływać się do dwuwymiarowej tablicy dynamicznej w oparciu o kontenery (jak to opisałem w pierwszym pytaniu)?
Pozdrawiam!

#include <QtCore/QCoreApplication>
#include <QList>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QList< QList<int> > list;

    for( int i = 0; i < 10; ++i )
    {
        QList<int> tmp;

        for( int j = 0; j < 10; ++j )
            tmp.push_back(i*j);
        list.push_back(tmp);
    }

    QList< QList<int> >::iterator it = list.begin();
    for( ; it != list.end(); ++it )
        qDebug() << *it << " ";

    for( int i = 0; i < list.size(); ++i )
        for( int j = 0; j < list.at(i).size(); ++j )
            qDebug() << list.at(i).at(j); //lub list[i][j]*/

    return a.exec();
}
0

Dzięki wielkie za odpowiedź!

Ten kod bardzo mi się przydał.

Problem jest z tym, że nie uruchamiają mi się pliki wykonywalne utworzone przez kompilator. Problem jest wyjaśniony tutaj (http://bexlab.pl/linkowanie-statyczne-qt-sdk-for-windows/132/), jednak były problemy z podążaniem za tym sposobem linkowania statycznego. Opisałem je w komentarzu i uzyskałem odpowiedź, że "Myślę, iż nie masz ustawionej zmiennej środowiskowej: QMAKESPEC: win32-g++". W jaki sposób mogę ustawić prawidłowo tą zmienną środowiskową? Wyszukiwanie (google: "QMAKESPEC: win32-g++") znajduje mi np. to (http://stackoverflow.com/questions/1123832/hardcoded-qmakespec-in-qt-creator), z czego niewiele dla mnie wynika.

Pozdrawiam!

1

Linkowanie statyczne nie jest dobrym pomysłem ponieważ plik wykonywalny jest dużo większy oraz potrzebujesz wykupić licencję komercyjną ponieważ darmowa nie pozwala na to (chyba, że pracujesz na komercyjnej licencji). Nie przeglądałem linku, który wrzuciłeś lecz ja Qt zawsze kompiluje ze źródeł i właśnie podczas config'a ustawiam poza różnymi innymi pierdółkami "-static" i po długotrwałej kompilacji wszystko ładnie śmiga. Musisz tylko w pliku projektu (.pro) bodajże dodać "CONFIG += static" czy coś w ten deseń. Lepiej jednak potrzebne dll'ki wrzucić do folderu z projektem i linkować dynamicznie.

0

Dzięki za odpowiedź!

Raczej dużo czasu mi zajmuje zwykłe odpalenie pliku wykonywalnego poza środowiskiem QT Creator, ale trudno, muszę to i tak zrobić, więc dalej próbuję się dowiedzieć, jak skonfigurować projekt i środowisko. Poszukałem w internecie na temat linkowania dynamicznego i z pewnego tematu (http://peb.pl/programowanie/846219-c-qt-tworzenie-wlasnych-plikow-dll.html) dowiedziałem się, że moje pliki .h muszą zawierać jakieś nie znane mi deklaracje (__declspec (dllexport) itd.). Wygląda również na to, że występuje istotna różnica pomiędzy używaniem include dla własnych plików i plików z bibliotek QT. Ktoś inny zaś sugerował, że obecnie rozwiązuje się to przy pomocy wtyczek (http://doc.trolltech.com/4.6/plugins-howto.html).

W jaki sposób mogę, krok po kroku, spowodować, że projekt stworzony w QT Creator będzie się dało odpalić poza tym środowiskiem? Próbuję już kolejnej metody, ale nic mi nie wiadomo o tych '__declspec', związanych z linkowaniem dynamicznym, ani tym bardziej o wtyczkach QT.

Znalazłem dość różne opisy linkowania dynamicznego, a większość to były rozmowy na forach, z których nic w zasadzie nie wynikało. Albo też były to długie instrukcje, w których przede wszystkim omawiano kod źródłowy, a wygląda mi na to, że raczej potrzebuję skonfigurować środowisko lub zmienić ustawienia projektu, a nie dokonywać istotnych zmian w kodzie.

Pozdrawiam!

1

Chyba nie zrozumiałeś mnie dobrze :) Kompilujesz swój program normalnie (w trybie release jeśli masz już gotowy projekt, bo dla debug musiałbyś dodać więcej bibliotek) i odpalasz go poza środowiskiem. Wtedy system zacznie się pluć o biblioteki (dll), które są dołączone razem ze środowiskiem. Wystarczy, że je znajdziesz w katalogu Qt, przekopiujesz do folderu z twoim exe i nie ma siły, żeby nie działało. Można też te biblioteki przekopiować do folderu systemowego i wtedy będą one dostępne również dla innych aplikacji.

1

Witam, też bawię się Qt 4.7.1, linkuję dynamicznie, tzn po skompilowaniu release'a exec mówi jakich dll brakuje, dorzucam je do katalogu z exe i działa.
Ten mój program to pseudo "web browser" oparty o QWebView.
Problem pojawia się gdy przeniosę folder z moim programem na inny komputer.
Wszystko niby działa, ale nie wyświetla obrazków, np interia.pl - treść wyświetlana ok, ale obrazki to tylko domyślne sygnaturki grafiki ze znakiem zapytania w środku.
Co może być problemem?
Pozdrwaiam.

Dla potomnych: cały czas brakuje plików źródłowych qt. Tym razem trzeba do folderu z aplikacją dorzucić folder z jego zawartością "imageformats" z lokalizacji instalki Qt. U mnie: => C:\Qt\2010.05\qt\plugins\imageformats

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