Współpraca bblioteki QT z DevCpp

0

Witam,

Mam zainstalowany DevCpp w wersji 4.9.9.2 + kilka paczek dostepnych z serwera devpack.

Poniewaz rozpoczynam zabawe z QT, sciagnalem ta biblioteke, po rozpakowaniu skompilowalem.

Chcialbym, abym mogl pisac kod w DevCpp i kompilowac za jego pomoca cale projekty wlacznie z QT.

Na ten moment, kiedy probuje skompilowac taki projekt, wywala mi wiele bledów m.in. ze w folderze nie ma QApplication.

Jak skleic QT z DevCpp?

0

podłączałem Dev-cpp pod qt4.3(na necie jest tutorial) ale kurcze nie mogłem używać makr(QObject itp.) więc odpadło. Ale na stronie trolltechu jest tutorial i wtyczka jak podłączyć qt4 pod eclipse+mingw, ewentualnie możesz spróbować z ms visual 2005 express edition(jak 3 mies. temu próbowałem to pod 2008 jeszcze nie chodziło ale może już działa). Ja po porażce z ms visual 2008 express edition i dev dałem spokój nie próbowałem jeszcze z eclipse ,bo mam linuksa i nie mam problemu z tym

0

może jakiś log błędów? jasnowidz ze mnie naprawdę kiepski

0

Ja zadam pytanie dodatkowe. Czy QT pojdzie z BCB?

0

Tego typu bledy:

[Linker error] undefined reference to _imp___ZN12QApplicationC1ERiPPci' [Linker error] undefined reference to QApplication::~QApplication()'

0

no to znaczy, że błędnie dołączasz(albo wcale) bibliotekę statyczną QT...
Poszukaj jak się dołącza biblioteki statyczne linkerowi w Dev C++, temat ten pojawia się często...

0

powiem ci jak ja to robilem - wylaczasz w devcpp automatyczne generowanie makefile'a, wchodzisz do katalogu ze zrodlami, qmake -project, qmake, potem w devcpp zaznaczasz korzystanie z wygenerowanego makefile'a - i voila. musisz tylko pamietac o aktualizacji makefile'a przy dodawaniu nowych plikow zrodlowych.

0

ale biblioteki statycznej nadal nie dołączyłeś, w opcjach projektu w polu Konsolidator(Linker), dopisz:
-lQT
zakładając że biblioteka statyczna nazywa się libQT.a, bo nie wiem jak się nazywa

0

@crayze:

Poszukaj jak się dołącza biblioteki statyczne linkerowi w Dev C++, temat ten pojawia się często...

Bez komentarza.

zakładając że biblioteka statyczna nazywa się libQT.a, bo nie wiem jak się nazywa

Po to pytam konretnie o Qt i DevCpp aby wypowiedziala sie w tym temacie osoba kompetentna.

@dodekam:
Rozumiem, ze u Ciebie wszystko polegalo na wlasnym generowaniu makefile'a. Reszta bez zmian.

Mam nadzieje, ze uda sie jednak polaczyc, aby wszystko dzialalo automatycznie. Czytalem kilka tutoriali na ten temat ale u mnie nie dzialaja. Zapewne przez wersje Qt.

Moja wersja Qt to 4.4.0.

0

Instalacja i konfiguracja biblioteki Qt z Dev-cpp

  1. Instalacja Dev-ccp i biblioteki Qt.

Pobrać aktualne wersje Dev-Cpp (z Mingw) i bibliotekę Qt (Windows Open Source Edition). Następnie zainstalować Dev-Cpp, następnie bibliotekę Qt według instrukcji po uruchomieniu setup dla każdej z aplikacji. W czasie instalacji Qt pojawi się pytanie o Previously instaled MinGW . Należy wtedy wskazać miejsce gdzie został zainstalowany Dev-cpp. Jeśli nie zmienialiśmy ustawień będzie to folder C:\Dev-Cpp

Źródła do pobrania:

<a href="http://www.bloodshead.net/dev/devcpp.html">http://www.bloodshead.net/dev/devcpp.html</a>
<a href="http://trolltech.com/downloads/opensource">http://trolltech.com/downloads/opensource</a>
  1. Konfiguracja Dev-Cpp z Qt

Uruchamiamy Dev-Cpp. W menu Narzędzia/Opcje kompilatora wybieramy zakładkę Katalogi. Teraz interesować nas będą już tylko zakładki tej karty.
Zakładając, że biblioteka Qt została zainstalowana w domyślnym miejscu:

• W zakładce Binarna dodajemy ścieżkę C:\Qt\4.4.0\bin (zależnie od wersji biblioteki numer się zmieni)
• W zakładce Biblioteki dodajemy ścieżkę C:\Qt\4.4.0\lib
• W zakładce Pliki Nagłówkowe C++ jest trochę więcej do dodania.
Dodajemy po kolei foldery z katalogu include.

C:\Qt\4.4.0\include\Qt
…
C:\Qt\4.4.0\include\QtUiTools

Dodajemy również C:\Qt\4.4.0\include

Potwirdzamy OK I zamykamy Dev-Cpp
  1. Dodanie ścieżki do Qt

Wchodzimy do Panelu sterowania  System  Właściwości systemu  Zaawansowane  Zmienne środowiskowe. W zależności czy chcemy dodać zmienne środowiskowe dla aktualnego użytkownika, czy dla całego systemu, czyli dla wszystkich użytkowników musimy do zmiennej Path dodać wpis C:\Qt\4.4.0\bin; podobnie do istniejących już tam wpisów. W tym celu należy po prostu zmienną Path edytować dodać wpis i potwierdzić. Jeśli takiej zmiennej brak, należy ją dodać poprzez Nowa.

Na tym etapie można spróbować wstukać pierwszy podstawowy tutorial Qt, który jest w zainstalowanym z biblioteką Qt Assistant. Powinno chodzić.
4. Jak sobie radzić z kompilatorem MOC – (Meta Object Compiler)

W 7 tutorialu Qt napotkałem błędy typu:

undefined reference to ‘vtable for …’

Oznacza to, że nie zadziałał MOC, który jest potrzebny np. kiedy w kodzie pojawi się hasło Q_OBJECT, przy sygnałach i slotach.

Utworzyć trzeba sobie plik qt.mak:

QT_MOC_UI_RCC=qt-moc-ui-rcc.exe

all-before: qt_moc_ui_rcc $(patsubst %.cpp,%.o,$(wildcard moc_*.cpp))

qt_moc_ui_rcc:
	$(QT_MOC_UI_RCC)

moc_%.o: moc_%.cpp
	$(CPP) -c $< -o $@ $(CXXFLAGS)

Zawierający dodatkowe polecenia dla kompilatora MOC i polecenia do tłumaczenia plików wygenerowanych w Qt Designer. Jeśli w projekcie korzystamy z którychś z wymienionych rzeczy to trzeba ten pliczek dołączyć.
W Dev-Cpp otwieramy menu  Projekt  Opcje projektu  Makefile , wybieramy utworzony przez nas qt.mak i dołączamy do Makefile.

Dalej opierając się na przykładzie z tutorialu 7 należy dołączyć do projektu plik moc_lcdrange.cpp
przedrostek moc + nazwa klasy w której jest Q_OBJECT + .cpp z zawartością:

#include "lcdrange.h"

const QMetaObject LCDRange::staticMetaObject = {};

const QMetaObject *LCDRange::metaObject() const {} 

void *LCDRange::qt_metacast(const char *_clname) {}

int LCDRange::qt_metacall(QMetaObject::Call _c, int _id, void **_a){}

Po kompilacji zawartość pliku ulegnie zmianie (działanie MOC) i powinno chodzić. Więcej o MOC:
http://www.potu.com/man/doc.trolltech.com/4.0/moc.html

Od autora tekstu:

Sam dopiero zaczynam przygodę z biblioteką Qt, więc są może lepsze rozwiązania, o których nie wiem. Udało mi się przebrnąć przez pewne problemy i działa. Chciałem więc trochę ułatwić innym życie na tyli ile potrafię.
Owocnego programowania!

0

Ważna rzecz, o której zapomniałem w punkcie 4 opisu. Dodatkowe narzędzie, które trzeba dołączyć, by kompilator MOC działał w pełni poprawnie. Należy wcześniej skopiować poniższy kod i skompilować do programiku qt-moc-ui-rcc.exe następnie wgrać programik do C:\Dev-Cpp\bin. W pliku qt.mak jest polecenie uruchamiające ten programik.

#include <QString>
#include <QTextStream>
#include <QFileInfo>
#include <QDateTime>
#include <iostream>

bool q_object( QString fichier );

int main(int argc, char *argv[])
{
    QDir dir;
    dir.setFilter(QDir::Files);
    QStringList liste = dir.entryList();
    for (int i = 0; i < liste.count(); ++i) {
        if( liste.at(i).right(2) == ".h" && q_object( liste.at(i) ) )
        {
            QString fichierMOC = "moc_"+liste.at(i).section(".",0,0)+".cpp";
            if( QFileInfo(liste.at(i)).lastModified() > QFileInfo(fichierMOC).lastModified() )
            {
                system(QString( "moc.exe " + liste.at(i) + " -o " + fichierMOC ).toLatin1() );
            }
        }
        if( liste.at(i).right(3) == ".ui" )
        {
            QString fichierUI = "ui_"+liste.at(i).section(".",0,0)+".h";
            if( QFileInfo(liste.at(i)).lastModified() > QFileInfo(fichierUI).lastModified() )
            {
                system(QString( "uic.exe " + liste.at(i) + " -o " + fichierUI ).toLatin1() );
            }
        }
        if( liste.at(i).right(4) == ".qrc" )
        {
            QString fichierRCC = "rcc_"+liste.at(i).section(".",0,0)+".cpp";
            if( QFileInfo(liste.at(i)).lastModified() > QFileInfo(fichierRCC).lastModified() )
            {
                system(QString( "rcc.exe -name " + liste.at(i).section(".",0,0) + " " + liste.at(i) + " -o " + fichierRCC).toLatin1() );
            }
        }
    }
    exit(0);
}

bool q_object( QString fichier )
{
     // Retourne true si le fichier contient la macro Q_OBJECT
     // Autrement retourne false
     QFile file( fichier );
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return false;
     QTextStream in(&file);
     while (!in.atEnd()) {
		QString line = in.readLine();
           if ( line.contains("Q_OBJECT") )
        {
			file.close();
            return true;
        }
     }
     file.close();
     return false;
}
0

tak organizacyjnie - pisales te teksty samemu czy jest to sciagniete lub na podstawie jakichs zrodel/artykulow? (linki?)
moze przeksztalcisz to na artykul na 4p? przydaloby sie innym zapewne

0

zrobilem wszystko do punktu 4 jak napisal Odkrywca i chcialem spawdzic te pierwsze czesci tego kursu od Qt ale przy kompilacji wywala mi

[Linker error] undefined reference to `_imp___ZN12QApplicationC1ERiPPci' 
[Linker error] undefined reference to `_imp___ZN11QPushButtonC1ERK7QStringP7QWidget' 
[Linker error] undefined reference to `_imp___ZN12QApplication4execEv' 
[Linker error] undefined reference to `QPushButton::~QPushButton()' 
[Linker error] undefined reference to `QApplication::~QApplication()' 
[Linker error] undefined reference to `QPushButton::~QPushButton()'    
[Linker error] undefined reference to `QApplication::~QApplication()' 
[Linker error] undefined reference to `_imp___ZN7QString4freeEPNS_4DataE' 
[Linker error] undefined reference to `_imp___ZN7QString16fromAscii_helperEPKci' 
ld returned 1 exit status 
 C:\Dev-Cpp\Makefile.win       [Build Error] [Projekt5.exe] Error 1
0

Korzystalem z nowej ksiazki wydawnictwa Helion "C++ Wykorzystaj potęgę aplikacji graficznych". Swoj egzemplarz nabylem w ksiegarni Politechniki Warszawskiej. Sa w niej opisane 2 biblioteki działajace na wielu platformach systemowych: wxWidgets i Qt.
Według mojego osobistego zdania ksiazka nie jest napisana prostym jezykiem jak na przyklad
"Symfonia C++". To co mi sie w niej podobalo to opis jak zainstalowac biblioteke Qt, ale z bledem. O MOC cos wspomniane, ale przynajmniej naprowadzilo czego szukac. Pokazane co biblioteka potrafi lacznie z obliczeniami wielowatkowymi. Na pewno najlepsze z tego wszystkiego jest plytka z przykladami i dodatkami. Po dlugich godzinach z ksiazka, tutorialem Qt i sleczac w necie udalo mi sie dojsc jak to wszystko razem poskladac. Ksiazka ma bledy, wiele rzeczy mamy sie domyslic, ale jednak do czegos sie przydala.
Stwierdzilem ze podziele sie tym co udalo mi sie odkryc, bo nigdzie nie ma napisane w prosty sposob jak radzic sobie z implementacja Qt.
Jak bede mial chwile to zrobie z tego artykul, co pewnie nie bedzie za szybko.

Przykro mi swistax jak juz wspominalem tez sie ucze Qt i z Twoimi bledami sie nie spotkalem. Musialbym szukac rozwiazania tak samo jak Ty. Wszystko co do tej pory wiem przekazalem jesli jeszcze cos znajde to dodam.

0

@swistax

Miałem identyczne błędy, bo nie dodałem do opcji projektu odpowiednich bibliotek do konsolidatora (linkera).
W opcjach projektu masz zakładkę: 'Dodatkowe opcje wiersza poleceń' i tam do konsolidatora dodjesz liby, znalezłem info, że wymagane jest dodanie “libQtCore”, “libQtMain” i “libQtGui”, ale ja dodałem wszytkie ;) no i Qt 4 nie ma kompatybilności ze starymi wersjami.
Ten blog mi pomógł: http://socek.org/2006/01/15/dev-c-i-qt/

Pozdrawiam

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