» »

Qt Designer -> KDevelop C++ Error

Qt Designer -> KDevelop C++ Error

'FireSTORM' ::

Z Qt Designerjem sem naredil main window, not vrgel menu, toolbar, listview itd itd
Tam sem ustvaril tudi .ui.h datoteko za ta window. Ustvaril nov projekt v KDevelop C++ te vse file ustvarjene z Qt Designer sem pometal v ta projekt(.cpp .h .ui in .ui.h). ui.h datoteka vsebuje kontrolerje za vse kar se nahaja v windowu(menu, tool, list...) In sedaj ko hočem kompajlat z KDevelop dobim take in podobne errorje:

.obj/media_arhiver.o(.text+0x0): In function `Media_Arhiver::fileOpen()':
: multiple definition of `Media_Arhiver::fileOpen()'
.obj/media_arhiver.o(.text+0x0): first defined here

In nekako nimam pojma zakaj se ta error pojavlja.
In še vsi trije file-i oz. samo del vseh fileov kjer je omenjen fileOpen():
media_arhiver.cpp:
    // signals and slots connections
    connect( fileOpenAction, SIGNAL( activated() ), this, SLOT( fileOpen() ) );

media_arhiver.h:
public slots:
    virtual void fileOpen();

media_arhiver.ui.h:
void Media_Arhiver::fileOpen()
{
  // Zaenkrat še prazno, še nisem spisal kontrolerja :)
}


Vsi ti file-i so ostali original kot jih je ustvaril Qt Designer oz. sem jih jaz z Qt Designerjem.
Kaj je tu narobe? Ciljam na to da je .ui.h in .h datoteki in potem to g++ vzame oba file-a kot .h datoteki in vidi dve definiciji enaki? Kako bi to rešil?
Hvala!
Those penguins.... They sure aint normal....

Gundolf ::

Najprej moraš še v Qt prevest. Oziroma vse skupaj prevest s qmake.

'FireSTORM' ::

Ne, rešil problem zvečer, ampak se mi ni dalo postat še tukaj :)
KDevelop iz .ui datotek generira .cpp in .h datoteke, ti dve datoteki sem moral prekopirat v drugo datoteko, zagnat make clean, ročno pobrisat .ui datoteko in naredit qmake -project in qmake šele nato make in napak ni bilo več. Če avtomatsko generiranih datotek cpp in h nisem skopiral v druge datoteke mi jih je make clean pobrisal.

Edit: typo
Those penguins.... They sure aint normal....

Zgodovina sprememb…

BigWhale ::

To si nekaj narobe naredil. Meni ni bilo nikoli treba telovadit tako kot si ti. KDevelop je vedno lepo prevedel stvari. From the scratch.

'FireSTORM' ::

in kaj bi naj narobe naredil?
Zdaj v drugo sem probal namesto z qt designerjem kar direktno z kdevelop ustvariti form, not nametal: menu, toolbar in listview. V ListView ustvaril columne, jih imenoval, uredil menu in toolbar. Ter probal kompajlat in error je bil enak. Probal potem tudi make clean in še enrkat qmake -project ter qmake in še enkrat kompajlat in spet enaki errorjih za multiple definition(torkat je bilo brez .ui.h datotek, bile so samo .h .cpp in .ui)
In tak dolgo sem dobival multiple definition errorje dokler nisem pobrisal .ui, pognal make clean, qmake -project in qmake.

Edit:
P.S: Qt r0x :)
BW mislim da si mi ti predlagal Qt, hvala! :)
Those penguins.... They sure aint normal....

Zgodovina sprememb…

Tutankhamun ::

FireStorm pol pa še men povej, kaj pa je tko dobr pr QTju ...
AMD Phenom QUAD 9950 Black Edition, 8GB

BigWhale ::

Firestorm, hm, qmake. Potem pa ne vem vec. Jaz sem vedno delal automake projekte. Oziroma KDE projekte. Tam si samo includal .ui datoteke pa je blo. Paziti si moral le takrat, ko si kak nov class dodajal, da si inheritance prav nastavil. Potem je pa kdevelop sam poskrbel za pravilen vrstni red prevajanja.

Tutan:

QT je cute! Dobesedno! ;> Dobr pr Qtju je to, da ima precej dobro razbit na samostojne komponente. Hell, jest uporabljam qstring povsod! ;> Ima podporo za networking, baze podatkov. Precej pametno se da oblikovati forme (si kdaj probaval narediti auto-resizing okno narediti v MFCj? ;>) in vecino razredov se lahko precej enostavno nadgrajuje.

'FireSTORM' ::

si kdaj probaval narediti auto-resizing okno narediti v MFCj?

...Ja?! :)
Those penguins.... They sure aint normal....

'FireSTORM' ::

Eno nubiš kveščn...
Imam dva classa, v prvem je list view in bi v ta listview rad "pisal" iz drugega classa, ampak mi nekako ne uspeva.
Narejeno imam tako:
Prvi class:
void Media_Arhiver::AddItem(QString Naslov, QString Opis, QString Tip, 
   QString St, QString Lastnistvo, QString IzposojenOd, QString Posojen)
{
    QListViewItem * item = new QListViewItem( listView1, 0 );
    item->setText( 0, Naslov );
    item->setText( 1, Opis );
    item->setText( 2, Tip );
    item->setText( 3, St );
    item->setText( 4, Lastnistvo );
    item->setText( 5, IzposojenOd );
    item->setText( 6, Posojen );
}


v drugem classu pa tako:
void Vnesi::VnesiButton_clicked()
{
    Media_Arhiver ma;
    ma.AddItem(Naslov, Opis, Tip, St, Lastnistvo, IzposojenOd, Posojen);
}


Če kličem AddItem iz prvega classa vnese normalno, ko pa ga kičem iz drugega classa se pa zgodi nič.

[edit: prelomil sem eno vrstico - gundolf]
Those penguins.... They sure aint normal....

Zgodovina sprememb…

  • spremenil: Gundolf ()

Tutankhamun ::

Seveda da ti ne dela. Media_Archiver dej kot globaln objekt, pa bo.


Ti ga tm v funkciji kreiraš neki not uneseš, pol pa ko se ta funkcija konča pa ta objekt sesuje...
AMD Phenom QUAD 9950 Black Edition, 8GB

'FireSTORM' ::

Global Object misliš static?
Če dam Media_Arhiver static je compiler error
konstruktor ne more biti static
če dam
AddItem kot static void namesto virtual void
je Error invalid use of Media_Arhiver::listView1 in static member function
pri tem:
QListViewItem * item = new QListViewItem( listView1, 0 );
Če deklariram še listView kot static member, torej static QListView *listView1
se sicer prevede ampak dobim pa linker error:

povezovanje bin/mediaarhiver (g++)
src/mainwindow.o(.text+0xda): In function `Media_Arhiver::languageChange()':
: undefined reference to `Media_Arhiver::listView1'
src/mainwindow.o(.text+0x12f): In function `Media_Arhiver::languageChange()':
: undefined reference to `Media_Arhiver::listView1'
src/mainwindow.o(.text+0x17d): In function `Media_Arhiver::languageChange()':
: undefined reference to `Media_Arhiver::listView1'
src/mainwindow.o(.text+0x1ca): In function `Media_Arhiver::languageChange()':
: undefined reference to `Media_Arhiver::listView1'
src/mainwindow.o(.text+0x217): In function `Media_Arhiver::languageChange()':
: undefined reference to `Media_Arhiver::listView1'
src/mainwindow.o(.text+0x264): more undefined references to `Media_Arhiver::listView1' follow
collect2: ld returned 1 exit status
gmake: *** [bin/mediaarhiver] Error 1

deklarirati celi class kot static class je pa nesmisel...

edit:
še koda funkcije languageChange:
void Media_Arhiver::languageChange()
{
    setCaption( tr( "Media Arhiver" ) );
    listView1->header()->setLabel( 0, tr( "Naslov" ) );
    listView1->header()->setLabel( 1, tr( "Opis" ) );
    listView1->header()->setLabel( 2, tr( "Tip" ) );
    listView1->header()->setLabel( 3, trUtf8( "\xc5\xa0\x74\x65\x76\x69\x6c\x6f" ) );
    listView1->header()->setLabel( 4, trUtf8( "\x4c\x61\x73\x74\x6e\x69\xc5\xa1\x74\x76\x6f" ) );
    listView1->header()->setLabel( 5, tr( "Izposojen od" ) );
    listView1->header()->setLabel( 6, tr( "Posojen" ) );
// ...
}


edit: probal sem tudi na tak način kot sem našel na guglu
v mainwindow.cpp (class Media_Arhiver)
vključim:
Media_Arhiver globalObject;
in v vnesi.cpp (Class Vnesi) za include-i:
extern Media_Arhiver globalObject;
ampak takret je error ob zagonu aplikacije:
QPaintDevice: Must construct a QApplication before a QPaintDevice
Those penguins.... They sure aint normal....

Zgodovina sprememb…

BigWhale ::

> Media_Arhiver ma;

Tole prestavi ven iz void Vnesi::VnesiButton_clicked().

'FireSTORM' ::

Če ga premaknem ven iz funkcije in pustim v vnesi.cpp je enak error pri zagonu, app before paint ali kakor koli že
če pa Media_Arhiver ma; postavim v class Vnesi pod public se prevede normalno, zažene normalno ampak vseeno po klicu funkcije VnesiButton_clicked ni nobene spremembe v listView1.
Those penguins.... They sure aint normal....

Tutankhamun ::

////// *.h //////////
class Vnesi
{
public:
void VnesiButton_clicked();

private:
   Media_Arhiver ma;
}


//////// *.cpp /////////
void Vnesi::VnesiButton_clicked()
{
    ma.AddItem(Naslov, Opis, Tip, St, Lastnistvo, IzposojenOd, Posojen);
}


Neki v tem stilu
AMD Phenom QUAD 9950 Black Edition, 8GB

'FireSTORM' ::

enako kot če pustim pod public:
zgodi se nič...
Those penguins.... They sure aint normal....

Gundolf ::

Jah ziher uporabljaš več različnih spremenljivk tipa Media_Arhiver, v eno pišeš spremembe, za drugo se pa čudiš da se ti nič ne spreminja :)

'FireSTORM' ::

Ok, morda sem neroden "programer" in marsikaj še ne vem, ampak nisem še pa zaenkrat slep...
No pa da bom jaz ziher sem spakiral celoten source directory in ga uploadal:
http://www.x-shells.org/source.tar
iz main.cpp se kliče mainwindow kateri ima class Media_Arhiver
in potem z void Media_Arhiver::seznamVnesi_nov_medij() se "prikaže" dialog za vnos vnesi.cpp/.h class Vnesi
v vnesi.h je pa samo ena spremenljivka Media_Arhiver (ma). Pod private. Če jo dam v vnesi.cpp je pa error ob zagonu aplikacije.
Those penguins.... They sure aint normal....

miha22 ::

Jaz sem si malo pogledal in ni nic cudnega da ti ne dela.
objekta Media_Arhiver * mw = new Media_Arhiver();
in Media_Arhiver ma; nista ista

nekaj delas na enem, nekaj na drugem....

'FireSTORM' ::

torej moram vse delat preko mw spremenljivke?
great...
Those penguins.... They sure aint normal....

'FireSTORM' ::

Ok do zdaj nisem mel nekaj obilico časa da bi se zafrkaval z tem, danes sem pa malo sprobal. In sicer ustvaril sem še en header (main.h) ter ga includal v main.cpp in vnesi.cpp. V main.h sem pa skropocal tole:
#include "mainwindow.h"


Media_Arhiver * mw = new Media_Arhiver();

Deklaracijo spremenljivke seveda umaknil iz main.cpp in spet dobim ta presnet Linker error:
src/vnesi.o(.bss+0x0): multiple definition of `mw'
src/main.o(.bss+0x0): first defined here
collect2: ld returned 1 exit status

tole je main.cpp:
#include <qapplication.h>
#include "main.h"

int main( int argc, char ** argv ) {
    QApplication a( argc, argv );
    mw->setCaption( "Media Arhiver" );
    mw->show();
    a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) );
    return a.exec();
}


in tole funkcija ki kliče mainwindow iz vnesi.cpp:
void Vnesi::VnesiButton_clicked()
{
    mw->AddItem( Naslov, Opis, Tip, St, Lastnistvo, IzposojenOd, Posojen );
}
Those penguins.... They sure aint normal....

Jean-Paul ::

Saj si sam napisal, da si dal #include "main.h" v dva cpp-ja, zato dobiš multiple definition error. Stavek
Media_Arhiver * mw = new Media_Arhiver();
nikakor ne sme biti preveden dvakrat. Daj ga v cpp file.

'FireSTORM' ::

v main.cpp misliš?
potem pri klicu iz vnesi button clicked 'mw' ne obstaja:
src/vnesi.cpp: In member function `virtual void Vnesi::VnesiButton_clicked()':
src/vnesi.cpp:173: error: `mw' was not declared in this scope
src/vnesi.cpp:173: warning: unused variable 'mw'
gmake: *** [src/vnesi.o] Error 1
Those penguins.... They sure aint normal....

BigWhale ::

#ifndef INC_MAIN_H
#define INC_MAIN_H

Media_Arhiver * mw = new Media_Arhiver();

...
...
...

/* Konec filetka */

#endif


To daj v main.h

In ga potem includaj v vseh .c filetkih, kjer bi rad uporabljal mw.

Zgodovina sprememb…

  • spremenil: BigWhale ()

Gundolf ::

Kolk mate problemov :)
V .h fajlih ne sme biti nobene kode, ki bi se izvršila ob klicanju h fajla. Četudi je zapakirana znotraj header guardov. Definicije spremenljivk so tudi koda (imajo lahko konstruktor). Torej v headerju se tole ne sme pojaviti:
Media_Arhiver * mw = new Media_Arhiver();

Kvečjemu rečeš
extern Media_Arhiver * mw;
in potem v enem .cpp fajlu definiraš globalno:
Media_Arhiver * mw = new Media_Arhiver();

Poskusi se izogibati uporabi globalnih spremenljivk. V večini primerov so odveč.

Je pa tole drugače en design flaw. Ker tule je ta pointer čist totalno brezveze. Lahko vse skupaj poenostaviš tako:
Media_Arhiver mw;
In ne rabiš nobenega new, nič pointerja. Enostavno deklariraš in uporabljaš (če hočeš met globalno potem še vedno velja recept od prej - extern v .h in običajna definicija v .cpp)

BigWhale ::

> Torej v headerju se tole ne sme pojaviti: Media_Arhiver * mw = new
> Media_Arhiver();


Seveda, vsekakor. My bad.

'FireSTORM' ::

Z pointerji je bil že mw ustvarjen ob ustvaritvi projekta oz. main.cpp
Ok zdaj je pa spet tist error ob zagonu:
QPaintDevice: Must construct a QApplication before a QPaintDevice
naredil sem po obojih navodilih
tisto z #ifndef
in tam potem namesto Media_Arhiver * mw = new Media_Arhiver postavil extern Media_Arhiver mw;
in potem še to dodal v main.cpp brez extern
probal sem nazaj naredit z pointerjem ampak je napaka enaka...
Zdaj če je morda to Qt error!?
Those penguins.... They sure aint normal....

'FireSTORM' ::

Ob deklaraciji spremenljivke tipa Media_Arhiver (ne kot pointer ampak navadno)
se avtomatsko zažene Media_Arhiver konstruktor?
Če se potem morda zaradi tega tečnari da je bil QPaintDevice pred QApplication?
Those penguins.... They sure aint normal....

miha22 ::

Problem je v kodi in ne v Qt-ju. Sprogramirano je slabo.

'FireSTORM' ::

In kje je sprogramirano slabo? Vse je blo KDevelop/Qt generated, edino AddItem funkcija in klic vnesi razreda in odpiranje dialoga
zdaj pa hočem iz tega dialoga pisat v listview ki se nahaja v mainwindow in sem pustil vse tako kot je ustvaril KDevelop/Qt
in sploh nisem kaj dosti spreminjal, sledil sem pa navodilom tukaj in še vedno dobim error. Zato sem morda podvomil če je napaka v Qt-ju...
Those penguins.... They sure aint normal....

Gundolf ::

> In kje je sprogramirano slabo? Vse je blo KDevelop/Qt generated
Ja in? Še vedno si programiral ti.

> in sploh nisem kaj dosti spreminjal, sledil sem pa navodilom tukaj in še vedno dobim error.
To je zdaj drug error. Sicer ti pa Qt čist lepo razloži v čem je problem.

> QPaintDevice: Must construct a QApplication before a QPaintDevice
Torej, ti ustvariš en Qt objekt tipa QPaintDevice še preden ustvariš in initializiraš QApplication. Verjetno zato ker uporabljaš globalne objekte. Ti so sranje, ker jih initializiraš takrat ko kreiraš (se pravi začetek programa). Da se jih seveda tudi kasneje ampak potem kar naenkrat ne rabijo biti več globalni. Kakorkoli že - tvoje uploadane kode se mi ne da it gledat, ampak sej imaš error že zadosti deskriptiven. Boš že našel kje je tvoj QPaintDevice in kako ga premaknit, da se bo ustvaril šele za QApplication.

'FireSTORM' ::

vem kje je _moj_ QPaintDevice
v QWidget ki je pa v Media_Arhiver konstruktorju...
Those penguins.... They sure aint normal....

miha22 ::

In MediaArhiver konstruktor se pokliče pa prej kot QApplication konstruktor. To je trenutni problem.

'FireSTORM' ::

zrihtal...
vrnil sem nazaj pointerje
v main h:
Media_Arhiver * mw;
man cpp:
Media_Arhiver * mw;
int main ... {...
...
mw = new Media_Arhiver;
...
}
vnesi cpp:
mw->AddItem....

miha22: poglej drug post na tej strani
nisem ravno tega napisal?
oz. sem domneval da je to to, ampak mi nihče ni potrdil, razen potem gundolf...
Those penguins.... They sure aint normal....

Zgodovina sprememb…

'FireSTORM' ::

Je možno kako z Qt izbrisati v datoteki samo eno določeno vrstico in jo ponovno prepisati?
oz. rad bi naredil tole, imam file in v njem tole:
mama
ata
sin
hčerka
stric
teta
.
.
.
in hčerka bi rad npr. spremenil v pes
in bi prebral peto vrstico(ok to vem) v eno spremenljivko, spremenljivko spemenil pes in to spremenljivko prepisal čez hčerko. Ok vem da tako bedastega stringa nebom prepisoval takole ampak v datoteki nimam tako bedastih stringov, v glavnem vzel bi "hčerka" ta "podatek" sprocesiral na svoj način in ga prepisal nazaj na isto mesto spremenjenega.
Se da to naredit kako z "one/two command only" ali bom moral rešiti kar na kak drug način?

P.S: nočem rešitve kako bi to rešil če se ne da z parimi Qt ukazi kot bi blo npr.
QFile::rewriteLine(vrstica, nov_string)
Those penguins.... They sure aint normal....

BigWhale ::

Lahko sam napises class... ;)

Ali pa externi program pozenes, ki bo to zamenjal ;>

'FireSTORM' ::

Se mi je kar zdelo, ker v dokumentaciji nikjer kaj podobnega nisem našel :D
Še ena,
QListView:
imam več stolpcev in zdaj ko kliknem na eno vrstico se označi samo prvi element(plavi okvir okrog prvega elementa), kako bi pa naredil da bi bil označen celotna vrstica?
Those penguins.... They sure aint normal....


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Android] Bluetooth aplikacija

Oddelek: Programiranje
51015 (878) marjan_h
»

C# WPF nalaganje info. iz XML dokumenta

Oddelek: Programiranje
6928 (748) MrStein
»

[Android]Cudno obnasanje aplikacije in emulatorja

Oddelek: Programiranje
71234 (1063) KernelPanic
»

Pomoč pri programčkih

Oddelek: Programiranje
152734 (2384) Mitja Bonča
»

C#, Dodajanje podatkov v Arraylist z Gumbom

Oddelek: Programiranje
82195 (2034) Beezgetz

Več podobnih tem