LINUX.ORG.RU
решено ФорумTalks

Портирование тяжёлых GTK приложений на Qt: документация, примеры, сравнение

 , ,


1

6

Раз: http://wiki.lxde.org/en/Migrate_from_GTK+_to_Qt

Два: http://wiki.lxde.org/en/GUI_Toolkit_Comparison

Очень познавательно.

Это от автора pcmanfm(-qt).



Последнее исправление: cetjs2 (всего исправлений: 1)

Ответ на: комментарий от intelfx

Okular и KDevelop

Неужели такие незаменимые вещи? Ни разу не видел ни то ни другое. С просмотром документов прекрасно evince справляется, а вместо IDE есть vim.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от intelfx

KDevelop

решил еще раз на него посмотреть - сходу же лажа, не умеет дополнять директивы препроцессора, нажал Ctrl-S - ошибка, что не может сохранить файл, вобщем как было глючной поделкой, так и осталось

wota ★★
()
Ответ на: комментарий от eternal_sorrow

Симметричный вопрос, назови нужный софт, на Qt, аналогов котрого нет на GTK+?

KDevelop/QtCreator, Okular, Amarok/Clementine

Pavval ★★★★★
()
Ответ на: комментарий от wota

нажал Ctrl-S - ошибка, что не может сохранить файл

ЩИТО? Ты уверен, что проблема в KDevelop?

И да, у него шикарное автодополнение. А директивы - далеко не показатель (небось меньше дня работы, чтобы их запилить).

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

ЩИТО? Ты уверен, что проблема в KDevelop?

а в чем? создал проект в хомяке, жму Ctrl-S - ошибка, в чем еще может быть проблема? свободного места 213G, если что, и кстати файл создался, но пустой

~$ ls -l /home/igor/projects/test/test.cpp 
-rw-rw-r-- 1 igor igor 306 кві 25 09:55 /home/igor/projects/test/test.cpp

http://i.piccy.info/i9/a807cb0f183d65f1bca0bfb6b3e0285c/1398411137/24345/7371...

А директивы - далеко не показатель

   vector<string> v { "123", "456" };
   for( string s : v )
     s.

я даже auto не использовал, а оно не смогло дополнить, что же тогда для него показатель?

   vector<string> v { "123", "456" };
   v[ 0 ].

аналогично, поделка и есть

wota ★★
()
Ответ на: комментарий от wota

кстати только заметил - оно создало файл в test, а пытается записать содержимое в test/src, это п%ц

wota ★★
()
Ответ на: комментарий от user_id_68054

и почему Qt не использует например pango, cairo и glib?

Что же ты вопрошаешь, содомит.

Solace ★★
()
Ответ на: комментарий от user_id_68054

потому что потом уже апстарт начал догонять системд с его фичами

xsektorx ★★★
()
Ответ на: комментарий от wota

если будет вопрос - а кто умеет, вот, например, QtCreator:

http://piccy.info/view3/6290787/055f98bbfed1812e4b662b2b78eab529/

да и все другие популярные IDE, кроме KDevelop, наверняка умеют

П.С. и даже так:

http://i.piccy.info/i9/28e86020d9ceeb2300d8d1a86915c4ad/1398412350/27581/7371...

а тут рассказывают про «шикарное автодополнение» в KDevelop

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

Симметричный вопрос, назови нужный софт, на Qt, аналогов котрого нет на GTK+?

QtCreator

Solace ★★
()

А наоборот есть? Хотеть avidemux и smplayer на GTK, например.

Lavos ★★★★★
()
Ответ на: Работал от Camel

Работал

ну и неужели не почувствовал разницу:

вот стандартный пример на GTK из их доки (я убрал комментарии):

#include <gtk/gtk.h>

static cairo_surface_t *surface = NULL;

static void
clear_surface (void)
{
  cairo_t *cr;

  cr = cairo_create (surface);

  cairo_set_source_rgb (cr, 1, 1, 1);
  cairo_paint (cr);

  cairo_destroy (cr);
}

static gboolean
configure_event_cb (GtkWidget         *widget,
            GdkEventConfigure *event,
            gpointer           data)
{
  if (surface)
    cairo_surface_destroy (surface);

  surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
                                       CAIRO_CONTENT_COLOR,
                                       gtk_widget_get_allocated_width (widget),
                                       gtk_widget_get_allocated_height (widget));

  clear_surface ();

  return TRUE;
}

static gboolean
draw_cb (GtkWidget *widget,
 cairo_t   *cr,
 gpointer   data)
{
  cairo_set_source_surface (cr, surface, 0, 0);
  cairo_paint (cr);

  return FALSE;
}

static void
draw_brush (GtkWidget *widget,
    gdouble    x,
    gdouble    y)
{
  cairo_t *cr;

  cr = cairo_create (surface);

  cairo_rectangle (cr, x - 3, y - 3, 6, 6);
  cairo_fill (cr);

  cairo_destroy (cr);

  gtk_widget_queue_draw_area (widget, x - 3, y - 3, 6, 6);
}

static gboolean
button_press_event_cb (GtkWidget      *widget,
               GdkEventButton *event,
               gpointer        data)
{
  if (surface == NULL)
    return FALSE;

  if (event->button == 1)
    {
      draw_brush (widget, event->x, event->y);
    }
  else if (event->button == 3)
    {
      clear_surface ();
      gtk_widget_queue_draw (widget);
    }

  return TRUE;
}

static gboolean
motion_notify_event_cb (GtkWidget      *widget,
                GdkEventMotion *event,
                gpointer        data)
{
  int x, y;
  GdkModifierType state;

  if (surface == NULL)
    return FALSE;

  gdk_window_get_pointer (event->window, &x, &y, &state);

  if (state & GDK_BUTTON1_MASK)
    draw_brush (widget, x, y);

  return TRUE;
}

static void
close_window (void)
{
  if (surface)
    cairo_surface_destroy (surface);

  gtk_main_quit ();
}

int
main (int   argc,
      char *argv[])
{
  GtkWidget *window;
  GtkWidget *frame;
  GtkWidget *da;

  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), "Drawing Area");

  g_signal_connect (window, "destroy", G_CALLBACK (close_window), NULL);

  gtk_container_set_border_width (GTK_CONTAINER (window), 8);

  frame = gtk_frame_new (NULL);
  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
  gtk_container_add (GTK_CONTAINER (window), frame);

  da = gtk_drawing_area_new ();
  gtk_widget_set_size_request (da, 100, 100);

  gtk_container_add (GTK_CONTAINER (frame), da);

  g_signal_connect (da, "draw",
            G_CALLBACK (draw_cb), NULL);
  g_signal_connect (da,"configure-event",
            G_CALLBACK (configure_event_cb), NULL);

  g_signal_connect (da, "motion-notify-event",
            G_CALLBACK (motion_notify_event_cb), NULL);
  g_signal_connect (da, "button-press-event",
            G_CALLBACK (button_press_event_cb), NULL);

  gtk_widget_set_events (da, gtk_widget_get_events (da)
                     | GDK_BUTTON_PRESS_MASK
                     | GDK_POINTER_MOTION_MASK
                     | GDK_POINTER_MOTION_HINT_MASK);

  gtk_widget_show_all (window);

  gtk_main ();

  return 0;
}

а вот рисовалка на Qt, которую я накидал сам:

#include <QtGui>
#include <QtWidgets>

struct Painter : public QLabel {
    Painter() {
        setPixmap( QPixmap( 600, 480 ) );
        setGraphicsEffect( new QGraphicsBlurEffect );
    }

    void mousePressEvent( QMouseEvent* e ) { s_ = e->pos(); }
    void mouseReleaseEvent( QMouseEvent* ) { s_ = QPoint(); }

    void mouseMoveEvent( QMouseEvent* e ) {
        if( !s_.isNull() ) {
            QPainter p( (QPaintDevice*) pixmap() );
            p.setPen( Qt::white );
            p.drawLine( s_, e->pos() );

            s_ = e->pos();
            update();
        }
    }

    QPoint s_;
};

int main( int argc, char** argv ) {
    QApplication a( argc, argv );
    Painter p;
    p.show();

    return a.exec();
}

https://www.youtube.com/watch?v=XrcdeAMd3z8

про стандартные примеры Qt и говорить нечего, там GTK и рядом не валялось

wota ★★
()
Ответ на: комментарий от wota

<сарказм> хотя нет, у меня не полный аналог стандартного примера GTK, у меня рисует линии, а надо видно отдельные квадраты:

http://i.piccy.info/i9/3592458b3d6e1908636f98f803c5450e/1398417532/9206/73713... </сарказм>

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от wota

Кислое и длинное

Wo-wo-wo, вы сравниваете примеры на разных языках! Вы бы ещё ассемблер с перлом сравнили: «Гляди как коротко и ёмко всё на перле.»

Camel ★★★★★
()
Ответ на: Кислое и длинное от Camel

Wo-wo-wo, вы сравниваете примеры на разных языках!

напиши на своем любимом, я не против

wota ★★
()
Ответ на: Кислое и длинное от Camel

вот кстати нашел этот пример на более продвинутом чем С++ ЯП:

(let ((surface nil))
  (defun example-drawing ()
    (within-main-loop
      (let ((window (make-instance 'gtk-window
                                   :type :toplevel
                                   :title "Example Drawing"))
            (frame (make-instance 'gtk-frame
                                  :shadow-type :in))
            (area (make-instance 'gtk-drawing-area
                                 :width-request 250
                                 :height-request 200)))
        (g-signal-connect window "destroy"
                          (lambda (widget)
                            (declare (ignore widget))
                            (leave-gtk-main)))
        ;; Signals used to handle the backing surface
        (g-signal-connect area "draw"
           (lambda (widget cr)
             (declare (ignore widget))
             (let ((cr (pointer cr)))
               (cairo-set-source-surface cr surface 0.0 0.0)
               (cairo-paint cr)
               (cairo-destroy cr)
               +gdk-event-propagate+)))
        (g-signal-connect area "configure-event"
           (lambda (widget event)
             (declare (ignore event))
             (when surface
               (cairo-surface-destroy surface))
             (setf surface
                   (gdk-window-create-similar-surface
                                   (gtk-widget-window widget)
                                   :color
                                   (gtk-widget-get-allocated-width widget)
                                   (gtk-widget-get-allocated-height widget)))
             ;; Clear surface
             (let ((cr (cairo-create surface)))
               (cairo-set-source-rgb cr 1.0 1.0 1.0)
               (cairo-paint cr)
               (cairo-destroy cr))
             (format t "leave event 'configure-event'~%")
             +gdk-event-stop+))
        ;; Event signals
        (g-signal-connect area "motion-notify-event"
           (lambda (widget event)
             (format t "MOTION-NOTIFY-EVENT ~A~%" event)
             (when (member :button1-mask (gdk-event-motion-state event))
               (let ((cr (cairo-create surface))
                     (x (gdk-event-motion-x event))
                     (y (gdk-event-motion-y event)))
                 (cairo-rectangle cr (- x 3.0) (- y 3.0) 6.0 6.0)
                 (cairo-fill cr)
                 (cairo-destroy cr)
                 (gtk-widget-queue-draw-area widget
                                             (truncate (- x 3.0))
                                             (truncate (- y 3.0))
                                             6
                                             6)))
             ;; We have handled the event, stop processing
             +gdk-event-stop+))
        (g-signal-connect area "button-press-event"
           (lambda (widget event)
             (format t "BUTTON-PRESS-EVENT ~A~%" event)
             (if (eql 1 (gdk-event-button-button event))
                 (let ((cr (cairo-create surface))
                       (x (gdk-event-button-x event))
                       (y (gdk-event-button-y event)))
                   (cairo-rectangle cr (- x 3.0) (- y 3.0) 6.0 6.0)
                   (cairo-fill cr)
                   (cairo-destroy cr)
                   (gtk-widget-queue-draw-area widget
                                               (truncate (- x 3.0))
                                               (truncate (- y 3.0))
                                               6
                                               6))
                 ;; Clear surface
                 (let ((cr (cairo-create surface)))
                   (cairo-set-source-rgb cr 1.0 1.0 1.0)
                   (cairo-paint cr)
                   (cairo-destroy cr)
                   (gtk-widget-queue-draw widget)))))
        (gtk-widget-add-events area
                               '(:button-press-mask
                                 :pointer-motion-mask))
        (gtk-container-add frame area)
        (gtk-container-add window frame)
        (gtk-widget-show-all window)))))
wota ★★
()
Ответ на: комментарий от Programmist11180

Ну вот хочу я вывести «Привет, isden!» с помощью QT. Если строки в нем utf16, то мне придется постараться.

cvs-255 ★★★★★
()
Ответ на: комментарий от cvs-255

Ну вот хочу я вывести «Привет, isden!» с помощью QT. Если строки в нем utf16, то мне придется постараться.

постараться прочитать документацию:

QLabel l( QString::fromUtf8( u8"Привет" ) );
l.show();

ну или:

qDebug() << QString::fromUtf8( u8"Привет" );

это если тебе надо именно UTF-8

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от wota

Ты что-то не так делаешь. Напоминает виндузятника, который, забыв передвинуть хардварный переключатель WLAN, немедленно начинает вопить «этот ваш линукс полное дерьмо, даже вифи не работает».

intelfx ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Skype, VirtualBox.

Точных GTK замен нету. Но есть аналоги

vertexua ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Для меня — да, незаменимые. В случае IDE я перетыкал очень много разных вариантов (vim — не IDE, так что сравнение некорректно), а Okular просто всем устраивает и умеет много форматов.

intelfx ★★★★★
()
Ответ на: комментарий от Suigintou

Не от гноморазработчиков, а от RedHat разработчиков, которые написали почти весь твой линукс. Да-да, именно тот на котором ты пользуешься KDE

vertexua ★★★★★
()
Ответ на: комментарий от intelfx

Ты что-то не так делаешь. Напоминает виндузятника, который, забыв передвинуть хардварный переключатель WLAN, немедленно начинает вопить «этот ваш линукс полное дерьмо, даже вифи не работает».

https://www.youtube.com/watch?v=y4q0r8ZPPdQ

ну и где у него «хардварный переключатель», который я забыл передвинуть?

wota ★★
()
Ответ на: комментарий от vertexua

Да ты чаще в KDE/Qt тредах чем я в нацпольных

Я уже был упоротым кедерастом еще до того, как ты зарегался.

Pavval ★★★★★
()
Ответ на: комментарий от wota

Аргумент

Ок, аргумент засчитан. Хотя не разобравшись почему в этом коде делают так, а не иначе, всё ещё не могу принять, что Qt чем-то лучше.

Camel ★★★★★
()
Ответ на: комментарий от cvs-255

gcc 4.7 и ранее

в gcc 4.3 уже была частичная поддержка, новые строковые литералы появились в gcc 4.5, ну и да - в старых версиях компиляторов поддержки С++11 не было и не будет, как бы это и так очевидно

wota ★★
()
Ответ на: комментарий от nanoolinux

Ты перепутал тулкиты местами. гтк сосёт.

Gtk рулит, Qt пeдалит, а WinAPI сосёт.

Novator ★★★★★
()
Ответ на: комментарий от vertexua

Да я ненавидел КДЕ еще до того как узнал что такое КДЕ.

Вот видишь - ты УПРЛС. А я сначала на гном посмотрел, перед тем, как его ненавидеть.

Pavval ★★★★★
()
Ответ на: комментарий от wota

В 4.6 поломали автокомплит. И видимо, чинить не будут, поскольку переезжают на clang в качестве автокомплита (как и QtCreator). В толксах даже тема проскакивала про это.

Так не работает:

vector<string> v { "123", "456" };
for( string s : v )
    s.
А так - работает.
vector<string> v { "123", "456" };
for( string s : v )
{
    s.
}
Не работает:
vector<string> v { "123", "456" };
v[ 0 ].
Но это работает:
map<string, string> m;
m["test"].

Kosyak ★★★★
()
Ответ на: комментарий от wota

Ага, шаблон проекта сломали (генерится один файл, а открывается другой). Бывает, но это не то, что ты описал.

intelfx ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.