Strona 2 z 2

: 07 lipca 2008, 17:26
autor: kazzomy
Dlaczego nie użyłem gtkmm?
Myślałem, że ma może ona jakieś dodatkowe funkcje dla c++, czy coś.

Teraz robię z gtk... Udało mi się przechwycić tablicę za pomocą "Gtk::Clipboard::get()" , ale nie jest ona w jakimś dziwnym typie "Glib::RefPtr<Clipboard>". Niestety nie ma ona zdefiniowanego operatora konwersji z Clipboard*.

Kod źródłowy:

Kod: Zaznacz cały

#include<iostream>
#include <gtkmm.h>
#include<string>

using namespace std;

int main(int argc,char **argv)
{
        Gtk::Main kit(&argc, &argv);
        Glib::RefPtr<Gtk::Clipboard> wwsk = Gtk::Clipboard::get();
/*        Gtk::Clipboard *wsk = wwsk;  W tej lini błąd : "cannot convert ‘Glib::RefPtr<Gtk::Clipboard>’ to ‘Gtk::Clipboard*’ in initialization" */

}
Btw. Dlaczego "int main(int argc, char **argv) " a nie "int main(int argc, char *argv)"?

: 07 lipca 2008, 17:26
autor: mikolajs
Zgadzam się z przedmówcą. Gtk+ jest raczej dla programistów C. W C++ trudno się pisze, gtkmm jest nadmiernie skomplikowane jak na tego typu bibliotekę, a samemu robić wrapera to dużo trudnej pracy. Dlatego znacznie prościej pisać w Qt używając C++. Znacznie lepiej używać biblioteki napisanej bezpośrednio dla danego języka.

: 07 lipca 2008, 17:57
autor: kazzomy
mikolajs pisze:Zgadzam się z przedmówcą. Gtk+ jest raczej dla programistów C. W C++ trudno się pisze, gtkmm jest nadmiernie skomplikowane jak na tego typu bibliotekę, a samemu robić wrapera to dużo trudnej pracy. Dlatego znacznie prościej pisać w Qt używając C++. Znacznie lepiej używać biblioteki napisanej bezpośrednio dla danego języka.
Dobrze, a czy do wydobycia stringa ze schowka mogę użyć tak samo Qt?

[ Dodano: 2008-07-07, 18:54 ]
No i ciągle nie mogę sobie poradzić.
Zmieniłem bibliotekę na Qt i doszedłem do czegoś takiego

Kod: Zaznacz cały

#include <QApplication>
#include<iostream>
#include<string>

using namespace std])
{
        QApplication app(argc, argv);
        QClipboard *clipboard = QApplication::clipboard();
        QString originalText = clipboard->text();
}
z kompilacji:

Kod: Zaznacz cały

g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED 
-I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore 
-I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o main.o main.cpp
main.cpp: In function ‘int main(int, char**)’:
main.cpp:11: error: invalid use of incomplete type ‘struct QClipboard’
/usr/include/qt4/QtGui/qwindowdefs.h:86: error: forward declaration of ‘struct QClipboard’
main.cpp:11: warning: unused variable ‘originalText’
make: *** [main.o] Błąd 1

: 07 lipca 2008, 23:52
autor: grzesiek
Btw. Dlaczego "int main(int argc, char **argv) " a nie "int main(int argc, char *argv)"?

Kod: Zaznacz cały

char* argv[]; // to wskaźnik do tablicy
char argv[]; // to tablica
a

Kod: Zaznacz cały

argv // sama nazwa tablicy to wskaźnik do pierwszego elementu
można go pobrać

Kod: Zaznacz cały

*argv
można by było poruszać sie po tej tablicy używając tylko wskaźnika wykonując operacje arytmetyczne na tym wskaźniku np:

Kod: Zaznacz cały

*(++argv) // 2 element w tablicy
no i w końcu skoro nazwa tablicy jest wskaźnikiem do jej pierwszego elementu to wskaźnik do tablicy można zapisać tak **argv jako wskaźnik do wskaźnika
w psełdokodzie:

Kod: Zaznacz cały

**argv == *(*argv==argv[]) // tu chodzi o typy a nie o wyłuskania czy co innego
(...)

BTW troche mnie dziwi ze tak żąglujesz tymi bibliotekami ;-)

wyciąłem część, która dotyczyła już tematu o QT i jest w cytacie tutaj.
mlyczek

: 08 lipca 2008, 00:24
autor: salmon
kazzomy pisze:Zmieniłem bibliotekę na Qt i doszedłem do czegoś takiego
Brakuje:

Kod: Zaznacz cały

#include<QClipboard>

: 08 lipca 2008, 11:34
autor: mikolajs
Musisz dodać pliki nagłówkowe, oprócz <QClipboard> używasz <QString> a nie <string>. Qt ma własną klasę dla stringów, warto jej używać w programach Qt. Do wyświetlania wyników możesz używać <QDebug> qDebug() << ;

Biblioteka Qt jest wydana na licencji GPL to chyba rozwiewa wątpliowści. (można sprzedawać programy, ale należy udostępniać źródła) Można jednak kupić wersję komersyjną i wtedy można rozprowadzać programy na dowolnej licencji. Licencja więc jest taka sama jak Gtk, jednak wiele firm niepokoi przejęcie jej przez Nokię np. Motorola zrezygnowała z używania Qtopi w nowych telefonach w obawie o zamknięcie następnych wersji rozwojowych Qt. Nokia zapowiada, że nie zmieni polityki Trolltech, a dla programisty open source nie jest to na razie problem bo w razie czego można wziąć ostatnią wersję na licencji GPL i rozwijać ją dalej (tak jak to było z XFree -> X11)

: 08 lipca 2008, 13:52
autor: kazzomy
No wreszcie mi się udało.
Użyłem gtkmm, może się komuś jeszcze przyda:

Kod: Zaznacz cały

#include<iostream>
#include <gtkmm.h>
#include<string>

using namespace std;

int main(int argc,char **argv)
{
        Gtk::Main kit(&argc, &argv);
        Glib::RefPtr<Gtk::Clipboard> schowek = Gtk::Clipboard::get();
        Glib::ustring text = schowek->wait_for_text();
        string text_sch = text;
        cout << text_sch << endl;
}


W sprawie Qt uważam, że nie ma nic w tym złego(po mimo tego, że omija się z zasadami open source)
Jeśli to są programiści, którzy poświęcają temu czas i nie mają z czego innego dochodów, to przecież też z czegoś muszą żyć.
Jeśli z kolei dochody z tego idą np. na stronę Qt etc. to też raczej nie ma w tym nic złego, w końcu mają prawo zgarniać pieniądze za program, którzy stworzyli i dobrze, że nie zgarniają od ludzi tylko chcą od firm, które mają z ich produktu największe zyski.
Cała parodia zaczyna się wtedy, gdy za pracę programistół, którzy nic az to nie dostają, jakaś korporacja dostaję pieniądze.

Pozdrawiam i dziękuję wszystkim za odpowiedzi.

: 09 lipca 2008, 12:33
autor: mikolajs
W QT było by tak:

Kod: Zaznacz cały

#include <QApplication>
#include <QDebug>
#include <QString>
#include <QClipboard>
using namespace std;

int main(int argc, char *argv[])
{
        QApplication app(argc, argv);
        QClipboard *clipboard = QApplication::clipboard();
        QString originalText = clipboard->text();
        qDebug() << originalText;
}
Tyle, że to rozwiązanie pobiera tekst który już znajduje się w schowku.
W sprawie Qt uważam, że nie ma nic w tym złego(po mimo tego, że omija się z zasadami open source)
Qt nie mija się z zasadami open source! Jest na licencji GPL v3 więc czym się różni od Gtk?