LINUX.ORG.RU

Графические тулкиты, реквестирую сравнительные обзоры кода


0

0

Удосуживался ли кто-либо сделать сравнительный обзор тех же GTK vs. Qt vs. Tk (хе-хе) в виде реализаций программы, не просто выводящей хеллоуворлд с кнопкой окей, а в виде решения какой-либо простой распространенной задачки — ну там, из SQLite-базы вычитать, в сетке отобразить, позволить редактирование элементов разного типа, сохранить обратно?

Как наглядный туториал было бы интересно почитать, если бы что-то такое даже в первом приближении имелось.

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

Дык сразу говорил бы что Py*. Тут пофиг, просто чего душа пожелает. Кода одинаково, копаться и находить разницу можно только в очень глубких внутренностях. Разница во времени в любом случае меньше чем рассуждать в треде целый день. На уровне python не видно что Qt более высокоуровневый, а gtk более труЪ и корректный.

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

Ну возьми и попробуй все варианты. Ты сейчас спрашиваешь настолько расплывчатые вещи что точного ответа тебе не даст никто. >>> NOKIA <<< N900 говоришь? => Qt

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от shimon

PyQT

#!/usr/bin/python

# simple.py

import sys
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

widget = QtGui.QWidget()
widget.resize(250, 150)
widget.setWindowTitle('simple')
widget.show()

sys.exit(app.exec_())

PyGTK

#!/usr/bin/env python

# example base.py

import pygtk
pygtk.require('2.0')
import gtk

class Base:
   def __init__(self):
       self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
       self.window.show()

   def main(self):
       gtk.main()

print __name__
if __name__ == "__main__":
   base = Base()
   base.main()

если у GTK убрать весь фетишь, то получится сильно короче кутешного варианта. но это субъективизм. они примерно одинаковы по объему кода. тут вопрос предпочтений. но все-таки нужно помнить, что pygtk актуальней к gtk (я имею ввиду то, что функционал gtk очень быстро появляется в питоновском бинде pygtk), что про куте не сказать. хотя могу ошибаться, может сейчас ситуация уже лучше стала.

Deleted
()
Ответ на: комментарий от I-Love-Microsoft

>NOKIA <<< N900 говоришь? => Qt

твоя неправда. они изначально были gtk. только потом сказали, мол ребята, мы тут начали куте любить. в реале, на сколько я знаю, все окружение как было на гтк, так и до сих пор таковое.

есть пруф? может я отстал от жизни уже :).

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

есть пруф? может я отстал от жизни уже :)

Ну да, GTK. Однако qt.nokia.com и следовательно в их продукте стои ожидать адекватную поддержку...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от lazyklimm

Почему? Под Qt пишут, кроме C++, как минимум на Python.

Deleted
()
Ответ на: комментарий от elipse

> Ну и с чем сравнивать это ?))

Process: sqlitestudio [35443]
Path: /Users/igor/Downloads/SQLiteStudio.app/Contents/MacOS/sqlitestudio
Identifier: pl.one.sqlitestudio
Version: 2.0.2 (2.0.2)
Code Type: X86 (Native)
Parent Process: launchd [1337]

Date/Time: 2010-12-05 11:24:01.796 +0300
OS Version: Mac OS X 10.6.4 (10F569)
Report Version: 6

Interval Since Last Report: 7856906 sec
Crashes Since Last Report: 195
Per-App Interval Since Last Report: 40 sec
Per-App Crashes Since Last Report: 1
Anonymous UUID: 7DDAD716-8CAB-4F49-94F0-5056D5F0E4D3

Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x000000000000000c
Crashed Thread: 0 Dispatch queue: com.apple.main-thread

Thread 0 Crashed: Dispatch queue: com.apple.main-thread
0 pl.one.sqlitestudio    0x00075268 0x1000 + 475752
1 pl.one.sqlitestudio    0x00071347 0x1000 + 459591
2 pl.one.sqlitestudio    0x0007f47b 0x1000 + 517243
3 pl.one.sqlitestudio    0x000a422c 0x1000 + 668204
4 pl.one.sqlitestudio    0x000ac2fc 0x1000 + 701180
5 pl.one.sqlitestudio    0x0005fd80 0x1000 + 388480
6 pl.one.sqlitestudio    0x0005fe82 0x1000 + 388738
7 tclGTJ9v5    0x027df93b Itcl_EvalMemberCode + 685
8 tclGTJ9v5    0x027df557 Itcl_InvokeMethodIfExists + 187
9 tclGTJ9v5    0x027e18ac Itcl_CreateObject + 1315
10 tclGTJ9v5    0x027d6fdb Itcl_HandleClass + 988


с поделками от M$ конечно

aho
()
Ответ на: комментарий от shimon

Есть какой-то ресурс, где такой код, желательно комментированный для самых маленьких, можно почитать? Чисто теоретические «пять строк» это не то.

Доки Qt? Как будет время, могу сам напечатать и прокоментировать.

Суть в том, что в Qt повсеместно применяется Model & View Framework. То есть вид и модель - отдельные компоненты. С Qt поставляется несколько готовых моделей, так же можно создавать свои. Так вот, одна из моделей, которые идут вместе с Qt, обрабатывает таблицу БД. Эта модель является редактируемой. Поэтому достаточно создать соединение с БД, создать модель, асоциировать ее с таблицей БД, создать QTableView, асоциировать ее с моделью.

Ты не так понял.

В гриде же надо как-то полученные данные показать? Надо как-то их редактировать? Надо узнавать, какие данные были изменены? Надо забрать изменившиеся данные в одну кучку, чтобы потом засунуть в базу обратно?

Qt сделает это сам. А с GTK и Tk это все придется реализовывать самому.

Deleted
()
Ответ на: комментарий от aho


1.
http://www.sqlmaestro.com/download/

At this page you can download our fully-functional trial versions as well as detailed printable documentation. If you did not install the software you intend to download yet, you should use a link to the full distribution package. If you want to upgrade the version of software currently installed on your PC, you can download an archive containing an executable file only instead of the full distribution package. The trial versions of the software available at this page can be used for an evaluative period of 30 day.

2. там что-то сильно торчат уши эклипса (а следовательно жабы)

Итого :
свободен

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

> там что-то сильно торчат уши эклипса

у тебя что-то с глазами

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

что именно рассказать ?
что на linux.org.ru критерий работоспособности программ обсуждается их зампуском Mac OS X ? ))

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

не «ну» и не «же»
SQLiteStudio - это все в одном, и не надо засорять систему установкой Qt
что-то там компилячить под актуальную версию qt и прочий всякий бред...

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

>В GTK объявление пустого класса выглядит вот так: http://pastebin.com/nAYzZ8LY Как бы ещё есть gtkmm, его корректнее с Qt сравнивать, т.к. С++ там и там пустой виджет тоже не большой:

#ifndef GTKMM_CUSTOM_WIDGET_MYWIDGET_H #define GTKMM_CUSTOM_WIDGET_MYWIDGET_H

#include <gtkmm/widget.h>

class MyWidget : public Gtk::Widget { public: MyWidget(); virtual ~MyWidget();

};

#endif //GTKMM_CUSTOM_WIDGET_MYWIDGET_H

SergikXP
()
Ответ на: комментарий от shimon

>Ну вот бы наглядно сравнить. Решение одной задачки там и там. Немного побаловался с gtkmm, т.к. С++ мне интереснее plain C. http://borisovs.livejournal.com/3389.html и он даже работает, а вот на Qt писал много, пару моих gpl программ здесь: http://code.google.com/p/qtaxi/ http://code.google.com/p/photomanager/

Субъективно на gtkmm писать надо больше, чем на Qt, для получения такого же результата. Но зато нет moc и некоторых ограничений, которые он привносит.

SergikXP
()
Ответ на: комментарий от Deleted

Qt пример можно расширить, добавить пустой деструктор и конструктор, это +2 строки. Тогда примеры будут почти эквивалентны. «Почти» - потому что придется расширять и GTK пример, т.е. дописывать методы constructed и constructor. Если понадобится добавить свойства - это еще по несколько строк в 5-6 местах на каждое свойство.

нужно несколько больше писать

Не несколько, а во много раз больше.

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

Я уже писал, Вы не только неадекватное сравнение привели по своей сути, но даже и в двух примерах неадекватный объем функционала. И при этом измеряете количество строк. Дальше же сами признаетесь (хотя и кривите изрядно)

добавить пустой деструктор и конструктор, это +2 строки

ой ли. ну даже если и так. пусть будет 2 строки.

добавить свойства - это еще по несколько строк в 5-6 местах

несколько - это «от 3 до 5». посему получается от 15 до 30 строк.

а теперь вдумайтесь, корректно ли сравнение, что Вы привели? Напишите полный QT-аналог того, что привели в GTK примере и посмотрите разницу. Да, GTK будет несколько больше, но не в той значительной разнице, о которой тут дезинформируете.

Deleted
()
Ответ на: комментарий от congestion_control

>А еще GTK нарушает strict aliasing.

Простите, но вы совсем чумной? GTK и «strict aliasing» - это как «красное» и «квадратное».

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

Сразу видно человека, не писавшего классов на GObject. Полный Qt аналог будет выглядеть так:

 
class GtkWidget : public GObject 
{ 
Q_OBJECT 
   ~GtkWidget(); 
};

GtkWidget::~GtkWidget() {

} 

Вот и все. Обратите внимание, _init функция в GObject - это не конструктор, а инициализатор типа. Там в основном делаются вещи, которые в C++ выполняет компилятор.

Если понядобится добавить свойства мне понадобится:

1. Добавить идентификатор свойства в enum. +1

2. Добавить само свойство в Private структуру. +1

3. Добавить сеттер. +3-4 строки

4. Добавить геттер. +3-4 строки

5. Добавить вот такой лиспоподобный код в _class_init: http://upload.wikimedia.org/wikipedia/commons/1/17/GObject_example.png

посему получается от 15 до 30 строк.

Против 1-2 в Qt? Это уже не «несколько больше»

Могу еще расписать, как создать виртуальный метод.

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

Я не ожидал, что будет так смешно. Спасибо. Тянет на хороший анекдот.

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

>Сразу видно человека, не писавшего классов на GObject.

улыбнул :)

Deleted
()
Ответ на: комментарий от congestion_control

объектная модель, реализованная на Си (я про GObject) не может в принципе выполнить strict aliasing, которое, кстати говоря, появилось только в С99. Объяснить на пальцах почему?

И да, а к чему ты тут про все это говоришь? «а я знаю еще вот такое вумное слово»? почитай еще раз ТС и посмотри его комментарии. Ты сейчас уводишь беседу в оффтопический холивар.

Deleted
()
Ответ на: комментарий от congestion_control

>Полный Qt аналог будет выглядеть так:

бррр. вчитайся внимательно, что я просил - «Напишите полный QT-аналог того, что привели в GTK примере и посмотрите разницу». Если не понятно, переформулирую - трансформируйте свои 2 строчки в примере QT до уровня функционала, который отражен в GTK-примере.

Deleted
()
Ответ на: комментарий от congestion_control

>К тому что чистый GObject непригоден для того, чтобы на нем писали люди.

опасения таки подтвердились :)

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

что про куте не сказать. хотя могу ошибаться, может сейчас ситуация уже лучше стала.

Привязка qt к python делается практически автоматически при помощи sip'а, поэтому новый pyqt обычно выходит практически сразу же после нового qt.

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

Я имел в виду, разве обязательно на Си реализовывать ООП с классами для создания оконных гтк+ приложений?

ns_ramesses
()
Ответ на: комментарий от aho

ну и к скольки языкам есть нормальные нативные биндинги без костылей типа smoke?

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

>привязанный к одному языку

неправда. попробуй PerlQT. есть также биндинг к питону. в плане читабельности кода, отсутствия лишнего обвязочного кода и удобству Qt однозначно выигрывает. но свои плюсы есть и у GTK, это к примеру биндинги для различных языков, в том числе и таких как PHP ( да, есть биндинг к пыхпыху), Ada, Ocaml , Haskell, Ruby и других. то есть если надо написать графическое приложение на нишевом языке - то это однозначно GTK.

хотя других преимуществ, кроме большого числа биндингов к разным языкам, я у GTK перед Qt не вижу.

Voviandr
()

<fat> Видимо, подводя итоги всего вышесказанного, можно сказать, что GTK - RIP. </fat>

pathfinder ★★★★
()

то, что ты написал, есть в Qt из коробки, а с гтк тебе придется юзать кучу разнородных библиотек

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

>привязанный к одному языку

полноценного биндинга нет только к С

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

>Есть у меня нокия N900, так вот — надо иногда собственного разлива тулзовинки для себя же писать.

Qt юзай, когда перейдешь на симбу, портировать будет гораздо легче

annulen ★★★★★
()

Gtk, Qt, Fox, Tk, Wx.

Одно время я сильно озадачился этим. Перечитал кучу обзоров в инете.
Понял, что нужно самому попробовать и решить.

В итоге остановился на Gtk (хотя Qt и FOX тоже вполне понравились).
Qt не понравился своей эпичностью (громоздковат для моих задач), а FOX - то что мало распространен. Wx - глючноват. Tk - убог.

Гуглируй:
http://www.google.ru/#q=python%20gui%20toolkit%20comparison
http://www.google.ru/#q=ruby%20gui%20toolkit%20comparison

Nordman
()
def slider = Slider {
          min: 0
          max: 60
          value: 0
          translateX: 10
          translateY: 110
        }

Stage {
  title: "Data Binding"
  scene: Scene {
    width: 220
    height: 170
    content: [
      Circle {
        centerX: bind slider.value + 50
        centerY: 60
        radius: 50
        stroke: Color.YELLOW
        fill: RadialGradient {
          centerX: 50
          centerY: 60
          radius: 50
          focusX: 50
          focusY: 30
          proportional: false
          stops: [
            Stop {
              offset: 0
              color: Color.RED
            },
            Stop {
              offset: 1
              color: Color.WHITE
            }
          ]
        }
      },
      slider
    ]
  }
}

anonymous
()
Ответ на: комментарий от congestion_control

>Слово klass выбрано специально чтобы не было конфликтов с C++.

как-то по-падонкаффски это выглядит

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