do

Potrzebujesz pomocy z C, C++, perl, python, itp.
kazzomy
Posty: 84
Rejestracja: 25 października 2007, 13:21
Lokalizacja: Warszawa

Post 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)"?
mikolajs
Posty: 33
Rejestracja: 04 lutego 2008, 10:06
Lokalizacja: Gdañsk

Post 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.
kazzomy
Posty: 84
Rejestracja: 25 października 2007, 13:21
Lokalizacja: Warszawa

Post 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
Awatar użytkownika
grzesiek
Junior Member
Posty: 932
Rejestracja: 06 stycznia 2008, 10:41
Lokalizacja: Białystok

Post 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
salmon
Beginner
Posty: 296
Rejestracja: 12 października 2007, 23:28
Lokalizacja: Gliwice/Bielsko-Biała

Post autor: salmon »

kazzomy pisze:Zmieniłem bibliotekę na Qt i doszedłem do czegoś takiego
Brakuje:

Kod: Zaznacz cały

#include<QClipboard>
mikolajs
Posty: 33
Rejestracja: 04 lutego 2008, 10:06
Lokalizacja: Gdañsk

Post 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)
kazzomy
Posty: 84
Rejestracja: 25 października 2007, 13:21
Lokalizacja: Warszawa

Post 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.
mikolajs
Posty: 33
Rejestracja: 04 lutego 2008, 10:06
Lokalizacja: Gdañsk

Post 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?
ODPOWIEDZ