QT -nybörjare.

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

QT -nybörjare.

Inlägg av jesse »

Försöker begripa mig på QT idag. Fattar inte så mycket dock.

Jag använder QT Creator, och har gjort följande enkla övning:
Understanding signal and slot in Qt

Här har jag alltså gjort två "grejer" och de kan prata med varandra...dvs siffan överförs till LCD-displayen.

Men jag vill ju veta hur jag bearbetar denna siffran.
Hur gör jag om jag har två sliders A och B t.ex. och vill visa A - B på LCD?

Jag måste alltså någonstans i C++ koden lägga in ställen där jag hämtar in data från silders och knappar etc. för att kunna bearbeta data och sedan skicka ut till LCD.

Om jag fattat det hela rätt måste jag skapa en egen funktion som kallas SLOT och som kan både ta emot och skicka signaler. Det är här jag inte hittar någon begriplig information hur jag ska göra.

Jag försöker begripa den här wikin också : Signals and Slots in Qt

Och här finns då exempel på connection mellan två objekt:

Kod: Markera allt

connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));
Det fattar jag ju. Men i mitt eget exempel så existerar ju ingen C++ kod för denna connection - bara ett xml-dokument.
Och i min klass - fil ser det ut så här:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
delete ui;
}
Men jag misstänker att jag ska kunna skapa en egen slot i den filen????
Trots att jag läser en masa tutorials så förstår jag inte det allra enklaste?
Användarvisningsbild
Carmis
Inlägg: 72
Blev medlem: 2 december 2008, 16:54:53
Ort: Växjö

Re: QT -nybörjare.

Inlägg av Carmis »

Det är väldigt enkelt, din XML-fil antar jag är din .ui fil, filen som du använder när du ändrar grafiken i designern.
Och allt som görs i den genererar en header fil i ditt fall: ui_mainwindow.h, denna är normalt sett gömd i projektet.
Men om du placerar markören över raden där det står '#include "ui_mainwindow.h" ' och höger-klickar och väljer första alternativet tror jag det är så kommer du till den filen och kan se den generarade koden.
Då blir allt mycket klarare.

Men själva koden som du är ute efter borde vara något i denna stilen:
I mainwindow.h:

Kod: Markera allt

private slots:
slot_kombineraLCD();
I mainwindow.cpp:

Kod: Markera allt

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

connect(ui->sliderA, SIGNAL(valueChanged(int)), this, SLOT(slot_kombineraLCD()));
connect(ui->sliderB, SIGNAL(valueChanged(int)), this, SLOT(slot_kombineraLCD()));
}

MainWindow::~MainWindow()
{
delete ui;
}

MainWindow::slot_kombineraLCD()
{
int temp = ui->sliderA.value() - ui->sliderB.value();

ui->LCD.value(temp);
}
Kanske ett fult exempel men jag har inte tid att gå in på det noggrannare nu. Desseutom stämmer inte metoderna, men jag tror du fattar poängen.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: QT -nybörjare.

Inlägg av jesse »

Ungefär något sådant hade jag tänkt mig, fast jag inte förstod hur. Hinner inte testa nu, håller på att laga mat åt famlijen.... återkommer. Tack för hjälpen! :)
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: QT -nybörjare.

Inlägg av jesse »

ui_mainwindow.h, denna är normalt sett gömd i projektet.
Ahh. Det är den koden jag letat efter. Hur ska jag annars veta vad mina knappar och reglage heter? (Nåja, det syns ju i den grafiska editorn, men jag vill kunna fatta hur det ser ut i koden).

Nu när jag kan se innehållet i den ska jag nog lyckas begripa det här...

Carmis: Använder du Qt3 eller Qt4? Det verkar vara en stor skillnad på dessa och när jag googlar får jag många svar att i Qt4 kan man inte längre skapa egna slots direkt, utan måste skapa en helt egen klass....?

(QT Creator linuxversionen kraschade oväntat... sen dess har den varit lite knepig, inte hittat PATH till kompilatorn, inte hittat filerna i projekten mm... men det verkar som om det börjar fungera bättre nu igen..)

.... lyckas ändå inte riktigt ... försökte det här (bland många andra försök som inte funkade):

Kod: Markera allt

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QObject::connect(ui->sliderA, SIGNAL(sliderMoved(int)), this, SLOT(kombineraLCD()));
    QObject::connect(ui->sliderB, SIGNAL(sliderMoved(int)), this, SLOT(kombineraLCD()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

MainWindow::kombineraLCD()
{
    int temp = ui->sliderA.value() - ui->sliderB.value();
    ui->LCD.value(temp);
}

med och utan QObject:: före connect. Jag får felmeddelanden:

Kod: Markera allt

/home/jens/avancerat/QT/MinTest02/mainwindow.cpp:-1: error: I konstruerare "MainWindow::MainWindow(QWidget*)":

/home/jens/avancerat/QT/MinTest02/mainwindow.cpp:-1: error: I global räckvidd:
Den tycks inte säga vad det är för fel, bara var det är nånstans.

---------

Hmmm. Ny information: Using a Component in Your Application.

Det verkar vara detta jag söker... Här går man noggrant igenom en egen kalkylatorfunktion. Alla tidigare tutorials eller exempel som jag sett ger en färdig kod utan att förklara var de får allt ifrån, så det är helt omöjligt att fatta hur man ska göra något eget.

Nu har jag suttit med det här inlägget i två timmar.... :dead: och inte kunnat posta det för jag känner att jag inte vet egentligen vad jag ska ge för information för att kunna komma vidare... Men nu ska jag studera länken om kalkylatorn, så återkommer jag.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: QT -nybörjare.

Inlägg av jesse »

Gudars skymning - om jag nånsin kommer att lära mig det här så är jag en hjälte! :wall:
Användarvisningsbild
kimmen
Inlägg: 2042
Blev medlem: 25 augusti 2007, 16:53:51
Ort: Stockholm (Kista)

Re: QT -nybörjare.

Inlägg av kimmen »

Vad är en "global räckvidd" för något? :lol:

"global scope" kanske? Hur är kompilatorn "översatt" egentligen? :shock:
Användarvisningsbild
Carmis
Inlägg: 72
Blev medlem: 2 december 2008, 16:54:53
Ort: Växjö

Re: QT -nybörjare.

Inlägg av Carmis »

Jag använder Qt 4.7.2 i Linux och där har jag skapat slots precis som jag beskrev tidigare utan problem..

Men som jag sa så stämmer kanske inte metoderna som va i koden t ex. så ska du inte anropa LCD.value(temp) utan LCD.display(temp)..
Hann inte ta reda på vilket det var innan..

Ifall det är för mycket problem med att använda flera klasser kan du testa att göra ett projekt utan en .ui fil där du kodar allt istället till en början, det finns många exempel för det.

Felmeddelandet du får säger mig ingenting tyvärr och det kanske kan vara en bra idé att få dem på engelska så du kan söka på Google efter felen..
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: QT -nybörjare.

Inlägg av jesse »

Jaaaa :happy: Pengen har trillat ner... :jimmyhacker:

Min första egna klass med egna slots är skapad - enligt Qt's egen maual och med bra stöd från Carmis...
så ska du inte anropa LCD.value(temp) utan LCD.display(temp)..
Hur hittar jag enklast vilka slots som fungerar här på respektive objekt? En väg är kanske att i den grafiska editorn gå in på "edit signal slots" och göra en signal, bara fört att kolla vilka alternativ som finns. Men det är ju "den hårda vägen". Man vill ju gärna veta vad de olika slotsen verkligen gör också, inte bara veta att de existerar? Editorn har ju auto-fill, men den verkar ta med alla signaler/slots som existerar, inte bara för just det objektet :wacko:

Men display(int) stämde ju för LCD-displayen.

(EDIT: jag hittade ju klassreferenserna på de sidor jag läste i :doh: t.ex QLCDNumber Class Reference )
Incidentally, QLCDNumber is the very oldest part of Qt, tracing its roots back to a BASIC program on the Sinclair Spectrum.
:eek2: Jag känner historiens vingslag!

En sak som tog lite tid att fatta var hur de egna slotsen knöts till signalerna:
När jag hade misslyckats ett antal gånger att göra som du skrev (vet inte varför) så tog jag bort de båda "connect"-satserna och läste innatill på Qt4-tutorial-sidan om "kalkylatorn" istället. Och där fanns inga connect alls!

Så jag fattade inte hur mina nya slots skulle knytas ihop med signalerna från mina slides. Men man namnger en slot efter ett bestämt mönster så att den automatiskt kopplas till en signal:
To automatically connect signals from the spin boxes defined in the user interface, we use the naming convention that indicates which widgets and their signals in the user interface should be connected to each slot. The first slot is called whenever the spin box called "inputSpinBox1" in the user interface emits the valueChanged() signal:

Kod: Markera allt

 void CalculatorForm::on_inputSpinBox1_valueChanged(int value)
 {
     ui.outputWidget->setText(QString::number(value + ui.inputSpinBox2->value()));
 }
En tanke som uppstod direkt är att om man gör en miniräknare med massor av knappar så vill man inte ha en slot för varje knapp - man vill ha en gemensam slot som kan anropas från flera knappar och som läser av allt och beräknar. Då kan ju inte namnet på slotten avgöra varifrån signalen ska komma. Och där funkar ju ditt exempel jättebra, Carmis!

Nu ser min enda slot ut så här:

Kod: Markera allt

void MainWindow::Calculate( void )
{
    int a = ui->SliderA->value();
    int b = ui->SliderB->value();
    ui->label_5->setText(QString::number(a * b));
    ui->lcd1->display(a - b);
}
och den anropas av en Pushbutton: Beraknaknapp->pressed()

Så nu när jag lärt mig att skapa fungerande slottar tror jag det kan börja flyta ... :razz:


Vad som står på kö att lära i Qt:

* serieportsfunktioner (har hört att det ska finnas i Qt)
* Qt filhantering
* Qt grafik - dvs. rita fyrkanter, kurvor, grafer....
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: QT -nybörjare.

Inlägg av jesse »

kimmen skrev:Vad är en "global räckvidd" för något? :lol:

"global scope" kanske? Hur är kompilatorn "översatt" egentligen? :shock:
Nu fattar jag även felmeddelandena: de innehöll ju ingen annan information än i vilken funktion felen fanns , men jag lyckades hitta en liten ikon att klicka på som expanderade meddelandena till en detaljerad förklaring
.
(och "Global räckvidd" är tydligen det svenska uttrycket för när det inte är inne i någon funktion eller klass).

Dags att sova då kanske :sleepy:
Användarvisningsbild
Carmis
Inlägg: 72
Blev medlem: 2 december 2008, 16:54:53
Ort: Växjö

Re: QT -nybörjare.

Inlägg av Carmis »

Härligt att du fick det att funka! :)

Det sättet som du visade på med miniräknaren där man inte använder connect har sina rötter i VB tror jag det var, så det är inte egentligen Qts, men så länge man kommenterar koden eller skriver på ett bra sätt så att man förstår att de ansluter till signaler är det bra. Annars blir det lätt för mycket hopp fram och tillbaka efter ett tag.

Och angående, "Hur hittar jag enklast vilka slots som fungerar här på respektive objekt?", precis som du hittade, klassreferenserna.
Dessa kan du även hitta i Qt creator om du klickar på F1 när du markerat klass namnet i editorn.

Sedan om du gillar att göra snygga grafiska applikationer så kan jag tipsa om QML från Qt också, det är ett helt nytt programmeringsspråk som är gjort för att integrera i C++ koden. Med det språket går det att göra användargränssnitt liknande dem i Android eller iPhone/iPad väldigt enkelt.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: QT -nybörjare.

Inlägg av jesse »

Just nu är det framför allt enkla grafer eller plottar som är intressanta... (presentation av data)....
Om jag lyckas få igång serieporten (med eller utan Qt) så ska jag kunna ta emot värden från 96 olika mätpunkter var 5:e sekund och beräkna lite statistik på dessa siffror för att presentera grafiskt, är det tänkt. Utöver detta skall temperaturer och annat visas grafiskt... Det är i alla fall målet när jag lärt mig det här ordentligt. Men först måste jag göra flera övnings-program.

När du tipsar om QML, så låter det för mig som overkill om man bara ska göra enkla staplar och grafer.
Jag är tills vidare väldigt nöjd med standardfönster och standardknappar. :) Eller är det enklare att använda QML även till enkla grafer i ett "vanligt" fönster...? Annars finns väl bra funktioner för detta i Qt som det är? Verkar som om QPainter-klassen är det jag ska börja med ?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: QT -nybörjare.

Inlägg av jesse »

Kört fast igen... :cry:

Det som gör att jag hela tiden får problem är att jag inte kan få ihop två verkligheter:

1) Qt Creator med Qt designer och
2) kodexempel i Qt-tutorial

Vitsen med Qt designer är ju att jag ska lätt kunna använda WYSIWYG-interfacet när jag bygger ett fönster. Men det innebär att jag måste göra allt i denna grafiska miljö, och får inte ändra i koden som genereras.

Men i alla kodexempel skriver man koden för fönstern direkt i C++ editorn och man "slipper" därmed WYSIWYG-editorns regler.

Exemplet jag just nu har problem med är här:
Ett enkelt Qpainterexempel: Example 3.2. Drawing a Line in a Window

Det hade ju varit lätt att kopiera det i en editor och så funkar det.

Men jag har ju redan byggt ett fönster med %% :twisted: &## Qt-designer, och jag vill ha en ruta i det fönstret (en Qwidget) , där jag vill dra min linje. Hela fönstret är ritat i Qt-designer.

Jag kan ju ändra koden i MainWindow.cpp men hur kommer jag åt min Qwidget som jag skapat i det fönstret? Jag har kallat den för "Grafikruta" för att den ska ha ett unikt namn.

Jag har inte lyckats rita någon linje någonstans genom att försöka använda exempelkoden och försöka pressa in den i den färdiga formen i MainWindow.cpp som jag fått från Qt designer. Jag lyckas inte ens göra en kompilerbar kod. Så helt klart har inte alla mynt trillat ner än när det gäller Qt... :roll:

Sen inser jag att jag inte heller riktigt hänger med i hur C++ fungerar: Jag kan programmera enkla program i C++ , men när det gäller att skapa underklasser till avancerade klasser osv. så är jag ovan och rör ihop det och fattar inte vad som är vad...

Just nu ser mitt fönster ut så här:
Qtskit.png
(Felmeddelandena kan man ignorera - jag försökte skriva in kod från exemplet direkt i min fil MainWindow.cpp men det är antagligen tokfel, så det är ingen idé att ens försöka felsöka - Fönstret fungerar bra när jag inte har med de extra raderna med Qpaint)
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: QT -nybörjare.

Inlägg av jesse »

Nu har jag börjat följa en begriplig hemmasnickrad tutorial om hur man programmerar PC-kommunikation med robotar via RS232... Med Qt designer! Så det är både serieport och Qt-design-fönster på en gång. Precis vad jag vill göra! :)

Designing an interface
Användarvisningsbild
jesper
Inlägg: 722
Blev medlem: 12 juni 2006, 16:04:08
Ort: Laem Mae Phim, Thailand

Re: QT -nybörjare.

Inlägg av jesper »

QT är underbart. Fina programmer med nästen ingen kodskrivning alls.

Tyvärr är QTDesigner inte särskild bra dokumenterat. När du börjar göra lite mer avancerade gränssnitt och ska aligna flera kontroller, kommer hela konceptet med Layout indelare att driva dig till vansinne.
Det blir ett näst intill evigt riva-upp-och-göra-om.
Men det finns ett otal finesser i QTDesigner som är svåra att hitta (eftersom dok'en är bristfällig), så stå på dig och försök bli kompis med det, det är det värt.

Och skaffa också qwt - en härlig samling widgets.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: QT -nybörjare.

Inlägg av jesse »

Jag har läst lite om qwt... I och med att jag vill göra grafer borde det vara perfekt, så slipper jag bygga allt med grafik själv. Men den här recensionen lät inte bra:
The quality of the project is very high and the choice of classes and methods is wide. The main problem is the documentation available only as Doxygen document. For an average programmer it is much more difficult to approach this library than the huge Qt itself.
( från qwt reviews)

Det är tufft att ge sig in på en svår, dåligt dokumenterad tredjepatrs bibliotek till Qt när man precis börjat med C++ (där jag knappt kan skilja på vad som är en klass, en metod eller en variabel... :roll: ) och just gjort mitt allra första fönster i Qt med ett par knappar... Jag har ju inte oändligt mycket tid över att lägga ner på detta heller - ibland måste jag ju jobba också. (och fira påsk, vara med familjen mm...)... så det är inte lätt...

Ska ändå försöka titta på qwt.

Mitt dilemma för ögonblicket är följande, som jag tror alla som har lite vana vid C++ eller Qt borde kunna svara på:

Jag försökte som sagt att kopiera RS232-programmet från den här sidan.

Problemet i korthet:

* jag har laddat ner, extraherat zip-filen och lagt filerna under C:\ och lagt dll-filen under C:\Windows:
Installing QextSerialPort

QextSerialPort is a third-party library for accessing the PC's serial port.
The normal procedure for installing this library is to download (use CVS to get the Qt4 version) and compile it (at a DOS prompt, type qmake and then make). This will compile the library and generate a dll.

The quick way to install the library is to download a precompiled version for Windows XP. This tutorial assumes you will extract this zip file on the C: drive, resulting in c:\qextserialport. For MSWindows to use a dll, it's directory must be in the PATH environment variable. Therefore, install the dll by copying c:\qextserialport\build\qextserialport.dll to C:\Windows.
Jag fattade inte det där med CVS, så jag hoppade över det och körde "the quick way".

Men nu till QT Creator: Jag följde guiden, ritade fönstret och skrev av kodexemplet:

Kod: Markera allt

// Talk to the robot over the serial link

#include <QApplication>
#include "MainWindow.h"
#include "SerialPort.h"

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	SerialPort *sp=new SerialPort();
	MainWindow *win=new MainWindow(sp);
	win->show();
	return app.exec();
}
kopierade de tre filerna
SerialPort.ui
SerialPort.h
SerialPort.cpp

till mitt projekt och lade till dem i projektet

.. och fick kompileringsfel:

Kod: Markera allt

#include <qextserialbase.h>
#include <qextserialport.h>
... hittar inte filen....

och det är ju inte konstigt, då qextserialbase/port.h ligger i C:/

och hur jag än försökt på alla sätt så lyckas jag inte lägga till en fungerande path till denna mapp!
Skriv svar