czwartek, 22 lipca 2010

Instalacja KDevelop dla Kubuntu/Ubuntu 10.04

Otwórz terminal i wprowadź następujące polecenia:

sudo add-apt-repository ppa:kubuntu-ppa/backports
sudo apt-get update
sudo apt-get install kdevelop

Aktualizowanie repozytorium w Ubuntu

gksudo gedit /etc/apt/sources.list

Dodaj na dole pliku np:
deb http://ppa.launchpad.net/chromium-daily/ppa/ubuntu intrepid main
deb-src http://ppa.launchpad.net/chromium-daily/ppa/ubuntu intrepid main


Potem w terminalu:
sudo apt-get update

Następnie:
apt-get install NAZWA_PROGRAMU

Projekt - Starter Aplikacji

Dziś rozpoczynam pracę nad nowym projektem. Starter aplikacji.
Szczegóły na stronie: http://sites.google.com/site/codecanfly/

Kontakt

niedziela, 4 lipca 2010

DevQt.pl - Polskie forum o Qt

O Qt mało jest polskich stron, a jeszcze mniej jest for. Wszystkim zainteresowanym tematyką tej biblioteki polecam zajrzeć na stronę: DevQt.pl

piątek, 11 czerwca 2010

Rysowanie szachownicy


Demo aplikacji, które ma na celu przedstawić podstawy rysowania z użyciem biblioteki Qt Jambi.

Artykuł: Przedstawienie rysowania w Qt Jambi.
Źródło: download

Przedstawienie rysowania w Qt Jambi.

W tym artykule przedstawię czytelnikowi niezbędne konstrukcje jakie pozwoliły mi utworzyć program demo "rysowanie szachownicy".

1. Wykonaj własny widget

Oczywiście można rysunek wykonać bezpośrednio na powierzchni własnej klasy MainWindow jednak w ten sposób traci się przejrzystość, ponieważ MainWindow musi obsługiwać rysowanie szachownicy. Co więcej gdybyśmy w przyszłości chcieli na ekranie przedstawić kilka szachownic to dla każdej sztuki musielibyśmy pisać na nowo kod w MainWindow. Dodatkowo trwając w tym sposobie nie mielibyśmy możliwości użycia szachownicy w Qt Designerze.

Jak wykonać własny widget?

W tym celu przeczytaj ten artykuł: "Własny widget w Qt Jambi"

2. Implementacja własnego widgetu

W tym zadaniu podstawowym celem jest nadpisanie metody:

protected void paintEvent(QPaintEvent e)

w trakcie działania aplikacji nie musisz jej wywoływać ponieważ tym zajmują się mechanizmy Qt.

3. Aby rysować niezbędne jest narzędzie rysownicze.

painter = new QPainter(this);

4. Jeżeli chcemy, aby narzędzie rysownicze używało antialisingu
Używamy tych instrukcji:

// wobec rysowania, prostych, figur itp
painter.setRenderHint(QPainter.RenderHint.Antialiasing);
// wobec rysowania tekstu
painter.setRenderHint(QPainter.RenderHint.TextAntialiasing);

5. Jeżeli chcemy zmienić kolor jaki używa narzędzie to w tym celu tworzymy pisak, i wstawiamy go do narzędzia.

QPen pen = new QPen(QColor.red);
painter.setPen(pen);

6. Jeżeli chcemy narysować tekst w tym celu dokonujemy takiej instrukcji.

// zarówno x jak i y są typu int, messageLine jest typu String (dla C++ jest typu QString)
painter.drawText(x, y, messageLine1);

7. Jeżeli chcemy narysować prostokąt używamy takiej instrukcji:

// x, y współrzędne
// fieldWidth szerokość
// fieldHeight wysokość
// QColor.black kolor
painter.fillRect(x, y, fieldWidth, fieldHeight, QColor.black)

8. Jeżeli chcemy rysować inne figury zalecam spojrzeć na stronę:
http://doc.qt.nokia.com/4.6/qpainter.html
Metody rysujące rozpoczynają się słowem "draw"

9. Aby narysować szachownice wykonuje się właściwie dwie rzeczy:
1. pierw ustawić tło widgetu na białe
2. narysować czarne kwadraty za pomocą podwójnej pętli

Teraz przeanalizuj kod. Algorytm jest zapisany w języku Java, jednak jest czytalny i łatwo go dostosować do C++.

czwartek, 10 czerwca 2010

Własny widget w Qt Jambi

Pierw należy dziedziczyć od kontrolki, a następnie należy wykonać implementacje. Przykład ukazuje utworzenie kontrolki na bazie QFrame.


import com.trolltech.qt.gui.*;

public class BlueFrame extends QFrame {
public BlueFrame(QWidget parent)
{
super(parent);
setStyleSheet("background-color:blue");
}

public static void main(String[] args) {
System.out.println("BlueFrame.java");
}
}


Kluczowym ruchem jest uruchomienie Project->Properties i oznaczenie Utworzonej klasy jako plugin. W tym celu klikamy na checkbox w kolumnie "Enable plugin".



Teraz pracując z Qt Designerem możemy wybrać naszą klasę z palety kontrolek i osadzić ją na formie.


Dla programujących w języku C++
Uruchom designera. Wstaw na formę pierw podstawową kontrolkę Qt z której dziedziczy twój widget.
W tym przypadku jest to QFrame. Następnie kliknij prawym klawiszem na jego powierzchnię.
Pojawi się menu kontekstowe, a w nim opcja zastąp. Wybierz ją. Następnie pojawi się okno dialogowe widżetów zastępczych.

Wprowadź nazwę zastępczej klasy. Kliknij przycisk "Dodaj". Oznacz checkbox w kolumnie nagłówek globalny. Teraz skompiluj program.

Polskie materiały na temat STL

Motywacja:
STL jest biblioteką, która pozwala oderwać programistę od wielu typowych zadań elementarnych. To pomyślna rzecz, ponieważ kod oparty o kolekcję kontenerów ułatwia zarządzanie danymi. To wpływa pozytywnie na logikę programu, a także oszczędność poświęconego czasu.

Strony internetowe:

Przelotne zwrócenie uwagi na istnienie STL. Tekst pisany dość trzeźwym językiem. W sam raz dobry na start.

Kurs niezupełny, jednak warty uwagi na sam początek.

Treść pozytywna, również stanowi dobre wprowadzenie.

Stronę proponuje czytać od momentu, gdy autor przedstawia alternatywę dla dynamicznych tablic. Plusem tekstu jest kod źródłowy podsumowujący całe spotkanie.

C++ bez cholesterolu. Polecam tu zajrzeć, gdy nawdychamy się wstępnych informacji o STL

Zalecam korzystać, gdy zamierzamy uzupełnić wiedzę o STL, nie wcześniej.

Polska sympatyczna niby-dokumentacja z przykładami, dość estetyczna.

Strona częściowo przetłumaczona, mimo to przedstawione przykłady kodu jasno wyrażają sposób używania STL. Strona po opanowaniu STL może być traktowana jako ściąga.

Magazyny:

WARP 2.0 Digital 03 (03-2006) (13) 80dpi,
artykuł stanowi proste wprowadzenie w tematykę STL.

Wykłady:

Paczka z wykładami zawierającymi w sobie pomocnicze rysunki,
kod, opisy STL, ubliżajace zrozumienie STL w praktyce. Wymagane
nieco większe pojęcie na temat STL niż blade

Bibliografia:

C++ biblioteka standardowa podręcznik programisty
O tej książce, można przeczytać kilka plotek w internecie, że książka jest zła, bo nie ma w niej fachowego tłumaczenia terminów. Fakt, kilka słów posiada trochę niecodzienne nazwy, lecz to wcale nie utrudnia analizy książki. Książka jest przyzwoita, omówienie STL dopasowane jest zarówno dla osoby początkującej jak i wprawionej. Książka omawia wszystkie tematy. Tu szczególnie podoba mi się zwracania uwagi na niewłaściwe praktyki używania STL.






Thinking in C++ tom 2
Poświęcono dwa obszerne rozdziały na cześć STL. Treści tej z pewnością nie polecam nowicjuszom, charakter obrazowania wiedzy w przypadku Bruce Eckel'a ma dość zbliżony do bombardowania, a to niekiedy utrudnia przyswojenie prostych dawek informacji. Proponuje zająć się książką w późniejszym okresie. Dodam jeszcze, że elektroniczne wydanie książki jest stosunkowo łatwe do zdobycia.







Szkoła programowania język C++ wydanie V
Książka dość pobieżnie podchodzi do STL. Fakt porusza wiele tematów, lecz w stosunku do całości jest tego zbyt mało. Wg mnie ten tekst można traktować jako interesująca zapowiedź STL po opanowaniu podstaw języka C++.









C++ dla programistów gier
W tej książce poruszono kwestie wydajności STL. Poza tym znaleźć tutaj można przystępne rysunki obrazujące sposób organizacji elementów w pamięci komputera. Mnie osobiście pozycja bardzo się spodoba.











Język C++ Standardy kodowania
Paczka solidnych rad. Mówiąc o STL znajdziemy tu kilka sztuczek, a także dowiemy się jaki algorytmy stosować, gdy mamy ich wiele do wyboru, a tym samym zależy nam na wydajności.















STL. Leksykon kieszonkowy
Leksykon kieszonkowy opisuje kontener po kontenerze, algorytm po algorytmie, iterator po iteratorze, a mimo to panuje tu wielki niedobór kodu źródłowego. Książka momentami jest usypiająca, przybiera postać dokumentacji, dlatego też polecam z niej korzystać jak z brukowca, czytać to co faktycznie nas ciekawi. Plusem jest wyróżnienie specjalnych uwag, które mogą być pominięte w wielu kursach. Elektroniczne wydanie książki jest stosunkowo łatwe do zdobycia.





Krótka uwaga dla publiki:
Jeżeli zauważyłeś nieprawidłowy odnośnik lub masz wolę do podzielenia się informacjami na temat innych polskich źródeł o STL, to w tym celu skontaktuj się ze mną poprzez maila lub poniższe pole na komentarz. Treść z linkami do nielegalnych plików będę usuwać.

Obsługa I/O w Javie na przykładzie java.io

To co drażniące może być w Javie przy przejściu z innych języków. To liczne zestawienie klas do obsługi I/O (wejścia/wyjścia). Możesz się o tym przekonać odwiedzając stronę http://java.sun.com/j2se/1.4.2/docs/api/java/io/package-tree.html. Same książki nie ułatwiają ich wykorzystania ponieważ uwaga skupiona jest na zobrazowaniu listy ważniejszych klas wraz z opisem i przykładowym kodem. Pojawia się wiele wątpliwości, przy zapisie poniższego kodu:
try {
InputStream in = new BufferedInputStream(
new FileInputStream("magiczne liczby.txt"));
} catch (IOException e) {
e.printStackTrace();
}
Dlaczego teraz muszę tworzyć kilka obiektów, by móc przeczytać sobie plik? Czy to kaprys projektantów mający utrudnić życie kodującym w Javie?

Środkiem potrzebnym do uzyskania odpowiedzi jest wzorzec projektowy "dekorator". To on wyraża relacje jaka istnieje między wspomnianymi klasami. Znając go zrozumiesz korzystanie z wielu podobnych schematów.

Opis szczegółowy wzorca znajdziesz w książce Head First Design Patterns, a także na stronie http://marioosh.5dots.pl/2009/02/wzorce-projektowe-decorator/, aby go pojąć niezbędne jest zrozumienie polimorfizmu.

Przejdźmy do rzeczy, spójrz na poniższy rysunek:



Klasa OutputStream (zielona ramka) oraz klasa FilterOutputStream (czerwona ramka) służą istnieniu relacji we wzorcu dekoratora, to dzięki nim możliwe jest zestawienie klas o którym powiem za chwilę. W tym wątku przedstawię tylko możliwość korzystania z gotowej relacji. Jeżeli chcesz umieć utworzyć własną relacje dekoratora to zajrzyj do lektury.

Najistotniejsza rzecz polega na użyciu składnika (niebieska ramka) i opakowaniu go w dekoratory (fioletowa ramka). Sam dekorator na nic się nie przyda. Jednak użycie go na składniku powoduje, że sam składnik zyskuje nowe możliwości. Mieszanie składnika z dekoratorami pozwala utworzyć obiekt, który będzie zawierał porządne przez nas cechy. W ten sposób z wielu prostych klas można tworzyć złożony obiekt dostosowany do naszych potrzeb.

Co więcej, istnieje możliwość tworzenia nowych własnych dekoratorów. W przykładzie utworzę dekorator pozwalający usunąć z wejścia cyfry. Przepuszcza tylko białe znaki i litery. Należy w tym celu utworzyć klasę, która będzie dziedziczyć od FileOutputStream. Klasę nazwałem AlphaStream.



Implementacja:

Plik: AlphaStream.java
import java.io.*;

public class AlphaStream extends FilterInputStream {
public AlphaStream(InputStream in){
super(in);
}

@Override
public int read() throws IOException{
int c;

while ((c = super.read()) != -1) {
if (Character.isLetter(c) || Character.isWhitespace(c))
return c;
}
return -1;
}
}

Plik: Main.java
import java.io.*;

public class Main {

public static void main(String[] argc) {
try{
InputStream in = new AlphaStream(
new BufferedInputStream(System.in));
String buff = "";
int c;
while((c = in.read()) >= 0){
buff += (char)c;
}
System.out.println(buff);
}
catch( IOException e) {
e.printStackTrace();
}
}

}

Instalacja Qt Jambi w Eclipse

Instalacja Eclipse
- pobierz: "Eclipse IDE for Java Developers"
- rozpakuj pobrany plik w docelowej lokalizacji
- utwórz katalog dla projektów Java
- uruchom Eclipse, by sprawdzić czy działa
- wprowadź ścieżkę katalogu dla projektów Java
- zamknij Eclipse

Instalacja Qt Jambi
- pobierz: "Binaries" zależne od platformy
- rozpakuj "Binaries" w docelowej lokacji
- zapisz w notatniku ścieżkę do głównego katalogu "Binaries"
Integracja Eclipse z Qt Jambi
- pobierz: "Eclipse Integration" zależne od platformy
- rozpakuj: "Eclipse Integration"
- zawartość katalogu plugins skopiuj do katalogu eclipse/plugins

Konfiguracja
- uruchom Eclipse
- uruchom Window->Preferences
- pojawi się okno dialogowe preferencji
- W polu Jambi Location wprowadź ścieżkę do rozpakowanego katalogu "Binaries"

Test
- uruchom File->Project...
- pojawi się Okno dialogowe nowego projektu
- wybierz Qt Jambi Project (Using Designer Form)
- nadaj projektowi nazwę, np. HelloQt
- pojawi się okno wyboru okna gui
- wprowadź "MainWindow" do pola Name
- wybierz foremkę "Main Window"
- otwórz plik MainWindow.java
- powinieneś otrzymać kod taki sam jak poniżej:

import com.trolltech.qt.gui.*;

public class MainWindow extends QMainWindow {

Ui_MainWindow ui = new Ui_MainWindow();

public static void main(String[] args) {
QApplication.initialize(args);

MainWindow testMainWindow = new MainWindow();
testMainWindow.show();

QApplication.exec();
}

public MainWindow() {
ui.setupUi(this);
}

public MainWindow(QWidget parent) {
super(parent);
ui.setupUi(this);
}
}

- teraz kliknij Ctrl+F11, aby skompilować i uruchomić program