QtContribs=Harbour+QT

Доброго времени суток.

В посте «Harbour — новое лицо xBase family» Александр Кресин рассказал, что такое Harbour.
Проект QtContribs — это расширение Harbour для использования Qt.

Т.е. все, кто знаком с dbase-языками программирования (foxpro, clipper и др.) смогут, используя QtContribs, писать кроссплатформенные приложения с хорошим графическим интерфейсом (конечно изучив «философию» Qt), да и вообще использовать всю мощь Qt.

Учитывая изложенное в посте «Разработка Qt-приложения с доступом к MySQL под Android», возможности для разработки под Android + mySQL также существуют.

Но главный разработчик библиотеки QtContribs (Pritpal Bedi) консервативен и не развивает ту часть, которая связана с QtSql.
Я посчитал это неправильным и немного поучаствовал в развитии этого направления.

(Исправлено) Сегодня(25.07.2014) главный разработчик QtContribs Pritpal Bedi, посмотрев мою работу, выложил новые биндинги для QtSql и сказал что будет развивать это направление. форум QtContribs Это здорово.

Далее покажу пример использования QSqlTableModel и QTableView.

Итак, в поставке Qt есть много примеров и среди них приложение sqlbrowser. Я взял из него файл browserwidget.ui — это окошко приложения, сделанное в qt-designer, и немного его исправил.

Подготовил проект.

Для связи объектов Harbour и Qt сделаны файлы с раширением qth — из них генерятся cpp-файлы (биндиги или проще связки).
Два файла qth я вложил в архив проекта.

Весь проект для Linux лежит здесь: форум QtContribs.

Сделал основную программу на Harbour:

#include "hbqtgui.ch"
#include "hbqtsql.ch"

STATIC s_db, s_oBrowser

PROC main()
   LOCAL oMainWindow, oELoop, lExit := .F.//, oApp
   LOCAL oStrModel, oStrList//, db
   CLS
   
   hb_cdpSelect( "UTF8EX" )//Основная кодовая страница приложения

   oMainWindow := QMainWindow()
   oMainWindow:setAttribute( Qt_WA_DeleteOnClose, .F. )

   oMainWindow:setWindowTitle("Qt SQL Browser")
   s_oBrowser = hbqtui_browserwidget(oMainWindow)
   
   oMainWindow:setCentralWidget(s_oBrowser:oWidget)
   
   oMainWindow:connect( QEvent_Close   , {|| lExit := .T. } )
  
   s_db = QSqlDatabase():addDatabase("QMYSQL")
   s_db:setHostName("localhost")
   s_db:setDatabaseName("test")
   
   IF .NOT. s_db:open()
      ?"Not Connected!"
      RETURN
   ENDIF

   oStrList :=s_db:tables()
   oStrModel := QStringListModel( oStrList, s_oBrowser:listView )
   s_oBrowser:listView:setModel( oStrModel )
   s_oBrowser:listView:connect( "clicked(QModelIndex)", { |d| showTable(d) } )

   oMainWindow:show()

   oELoop := QEventLoop( oMainWindow )
   DO WHILE .t.
      oELoop:processEvents()
      IF lExit
         EXIT
      ENDIF
   ENDDO
   oELoop:exit( 0 )
   
   RETURN
   
PROCEDURE showTable(d)
   LOCAL cTName
   LOCAL model
   cTName := s_oBrowser:listView:model():data(d, 0):ToString()
   cTName := s_db:driver:escapeIdentifier(cTName, 1/*QSqlDriver():IdentifierType:TableName*/)

    model := QSqlTableModel(s_oBrowser:table, s_db)
    model:setTable(cTName)
    if (model:lastError():type() != 0)
       ?model:lastError():text()
    endif
    model:select()
    if (model:lastError():type() != 0)
       ??model:lastError():text()
    endif
    s_oBrowser:table:setModel(model)
//    s_oBrowser:table:setEditTriggers(QAbstractItemView_DoubleClicked+QAbstractItemView_EditKeyPressed)
   RETURN


Получилось вот что:

image

Вот и все, казалось бы.

Но чтобы это заработало, нужен драйвер qtmysql — его компиляция — это системный вопрос, там же на форуме я кратко описал, как это сделать.

Тем, кто заинтересовался, предлагаю посмотреть туториал разработки простых QtContribs-приложений: HBQT-Tutorial.

Приглашаю всех обладающих свободным временем и желающих разбираться в Си, Си++ и других языках к развитию проекта. В ближайших планах сообщества интеграция отладчика в Harbour IDE(сокращенно HbIDE).

Если возникнут вопросы (нужна информация на русском языке) как собрать и использовать Harbour и QtContribs, что такое HbIDE и как ее использовать, и другие, то я готов продолжить…

Скачать исходники и исполняемые файлы можно в этом репозотории sourceforge.net

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 25

    0
    Мы сделали его:
    image
      0
      Хорошо бы добавить в статью ссылку на место, откуда его можно скачать.
      И вопрос: QtContribs имеет какое-либо отношение к hbqt, который входит в набор contrib для Harbour?
        0
        QtContribs это и есть hbqt из набора contrib. Только некоторое время назад он отделился от Harbour и вылился в отдельный проект.
        Теперь в папке contrib нет hbqt.

        Ссылки есть в заголовке форума, на который я ссылался. Но я размещу прямую. Спасибо.
          0
          > Теперь в папке contrib нет hbqt.
          github.com/harbour/core/tree/master/contrib/hbgt

          И еще. Наверное, уместнее было бы спросить в соответствующей группе, но раз уж мы тут…
          Что-то он у меня не компилируется.

          hbmk2 qtcontribs.hbp

          получаю:

          hbmk2: Building sub-project (level 2): debug\hwgdebug.hbp
          hbmk2: Target up to date: ..\..\lib\win\bcc\hwgdebug.lib
          hbmk2: Building sub-project (level 2): hbqt\qtcore\hbqtcore.hbp
          hbmk2: Building sub-project (level 3): hbqt\qtcore\hbqtcores.hbp


          и на этом — все…
            0
            Я еще корректирую hb*-файлы, а то мне кажется hbmk2 несколько проходов делает.

            1. В файлах hbqtwidgets.hbc, hbxbp.hbc комментирую строку
            #libs=hbqt.hbc
            2. Создаю в папке hbide файл hbide.hbc с одной строкой:
            plugins=/home/alex/workspace/qtcontribs-code/hbqt/hbmk2_qt.hb
            3. Корректирую hbide.hbp — вот исправленный фрагмент файла:
            /home/alex/workspace/qtcontribs-code/hbxbp/hbxbp.hbc
            
            hbide.hbc
            
            #/home/alex/workspace/qtcontribs-code/hbqt/hbqt.hbc
            
            gtqtc.hbc
            
            -lsupc++
            -lhbqtcore 
            -lQt5Core 
            -lhbqtgui 
            -lQt5Gui 
            -lQt5Widgets 
            -lQt5PrintSupport 
            #-lhbqtnetwork 
            #-lQt5Network 
            #-lhbqtsql 
            #-lQt5Sql 
            #-lhbcplr 
            #-lhbdebug 
            #-lharbour
            #-lQt5Designer
            #-lQt5Xml
            
            /home/alex/workspace/qtcontribs-code/hbqtwidgets/hbqtwidgets.hbc
            /home/alex/workspace/harbour-core/contrib/hbformat/hbformat.hbc
            


            4. в некоторых hbp-файлах прописываю полный путь к некорым hbc-файлам(если есть ошибки сборки)
            0
            Вот нашел примеры для винды:
            groups.google.com

            по названиям переменных окружения можно найти в гугле
              0
              Да, и обратите внимание hbqt<>hbgt
            0
            Наверно нужно переменные окружения определить.
            Вот мой батник для Linux:
            ./copy_inc.sh
            export HB_QT_MAJOR_VER=5
            export HB_WITH_QT=/opt/Qt/5.3/gcc/include
            export HB_QTPATH=/opt/Qt/5.3/gcc/bin
            export LD_LIBRARY_PATH=/opt/Qt/5.3/gcc/lib
            /usr/local/bin/hbmk2 ./qtcontribs.hbp -pic -L/opt/Qt/5.3/gcc/lib >log.txt
            ./copy_libs.sh

            В общем по аналогии для винды. Но если нужно точно я могу поискать ссылку на пример виндовой сборки
            и без подробных ошибок часто сложно сказать в чем дело.
              0
              Вот, может быть, будет интересно — тред про intellisense в hbide:
              форум qtcontribs
                0
                Пришлось обновить Harbour — у меня был 3.2. Получается, что QtContrib не строится со стабильной версией Harbour (3.0) с официального сайта — что, вообще говоря, неправильно.
                Вроде, компиляция пошла, но я рано радовался — когда дело дошло до каталога hbqtwidgets, сразу же вылетела с ошибкой: «Can't open #include file hbqtgui.ch» — где-то не прописан к нему путь…
                  0
                  у меня в батнике сборки вызывается еще батник копирования ch-файлов, я уж не помню зачем, но может пригодится:
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qscintilla/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qscintilla/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtbluetooth/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtbluetooth/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtcore/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtcore/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtdeclarative/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtdeclarative/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtdesigner/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtdesigner/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtgui/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtgui/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtmultimedia/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtmultimedia/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtmultimediawidgets/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtmultimediawidgets/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtnetwork/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtnetwork/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtopengl/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtopengl/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtpositioning/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtpositioning/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtqml/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtqml/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtquick/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtquick/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtscript/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtscript/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtsql/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtsql/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtsvg/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtsvg/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtwebkit/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtwebkit/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtwebsockets/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtwebsockets/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtxml/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qtxml/*.hbx /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qzxing/*.ch /usr/local/include/harbour -r 
                  cp /home/alex/workspace/qtcontribs-code/hbqt/qzxing/*.hbx /usr/local/include/harbour -r 
                  
                    0
                    Ясно. Из-за того, что пути к заголовочным файлам не прописаны вы все эти файлы переписываете в одно место — в include/ от Harbour. Но мне не хотелось бы засорять эту папку — потом труднее найти нужные файлы.
                    0
                    Расскажу о еще одной особенности применения Qt.
                    QtCreator при сборке проектов, в которых имеются интерфейсы .ui, генерирует в рабочем каталоге сборки файлы .cpp с классами описывающими этот интерфейс.
                    В примерах Qt я увидел, что функционал интерфейса можно расширять за счет наследования от генерируемых классов.
                    В QtContribs плагин hbmk2_qt.hb также генерирует .prg файлы в рабочем каталоге сборки, тоже с классами описывающими интерфейс файлов .ui.
                    От них тоже можно делать производные классы.
                      0
                      А почему в .hbp — файлы включены всякие .ui, .qrc? У меня Harbour пытается их откомпилировать и, естественно, вылетает с кучей ошибок.
                        0
                        Продублировал *.ch файлы, убрал из .hbp .ui и .qrc — при финальной линковке получил unknown function HBQTRES_HBIDE(). Проверил — она действительно упоминается (вызывается ) только один раз — в hbide/main.prg… Где она объявляется-то?
                          0
                          Файлы .ui(формата xml) — это описания форм, созданные в QtDesigner(конструктор интерфесов).
                          Плагин hbmk2_qt.hb из них генерирует .prg файлы в рабочем каталоге сборки.
                          qrc — я могу предположить это перечень ресурсов(картинки и прочее).
                          Не надо их удалять, давайте лучше ошибки разберем.

                          Где объявляется HBQTRES_HBIDE() если честно не задавался вопросом.
                          Прочтите внимательней комментарии выше.
                            0
                            Ошибки? Ок.
                            hbmk2[hbqtwidgets]: Warning: Cannot nest deeper in
                            C:\Harbour\addons\hbqt\hbqtcore.hbc
                            hbmk2[hbqtwidgets]: Warning: Cannot nest deeper in
                            C:\Harbour\addons\hbqt\hbqtgui.hbc
                            hbmk2[hbqtwidgets]: Warning: Cannot nest deeper in
                            C:\Harbour\addons\hbqt\hbqtnetwork.hbc

                            hbqtwidgets\scroll.ui(1) Error E0030 Syntax error «syntax error at '<'»

                            hbqtwidgets\scroll.ui(2) Error E0030 Syntax error «syntax error at '<'»


                            И так на каждую строчку в scroll.ui. Может, предупреждение, что hbmk «Cannot nest deeper in...» связано с тем, что scroll.ui не преобразовался во что должен…
                          0
                          Ворнинги пропустим я на них не обращал внимания.

                          hbqtwidgets\scroll.ui(1) Error E0030 Syntax error «syntax error at '<'»
                          


                          это означает невозможность обработки ui-файла программой сборки hbmk2. Для обработки данного типа файлов должен быть подключен плагин hbmk2_qt.hb.
                          (Если будет интересно поищите информацию о плагинах hbmk2.)
                          Путь к нему прописан в файле hbqt_common.hbc, на который ссылаются другие файлы hbc. Я исправлял эту ошибку прописывая полный путь в файлах hbp.
                          В данном случае мне кажется в файле hbqtwidgets.hbp надо прописать полный путь к файлу hbqt.hbc. По идее он должен находить его в каталоге /usr/local/share/harbour/addons/hbqt. Если честно я не знаю почему этого не происходит. Я указывал путь к исходникам — у меня здесь /home/alex/workspace/qtcontribs-code/hbqt/.

                          К тому же вся эта завязка списков библиотек в файлах hbc, по-моему, не оптимальна и hbmk2 делает несколько проходов.
                          Если вы хотите сократить время пересборки(можно и потом) прочтите внимательно мой комментарий выше о корректировке hbp-файлов(там 4 пункта).
                            0
                            Кстати а ворнинги — видимо подскажут где искать причину
                            0
                            Построил, наконец, hbide. Для этого понадобилось следующее:

                            1. Взять свежий Harbour ( в 3.2, который у меня был, hbmk не поддерживал какие-то вещи ) и откомпилировать его с ключом HB_WITH_QT=...
                            2. Создать скрипт для сборки, в котором установить HB_QT_MAJOR_VER, HB_WITH_QT и HB_QTPATH
                            3. Переписать в hbqtwidgets/ и в hbxbp/ файлы hbqtgui.ch, hbqt_version.ch, hbqtcore.ch — в harbour/include все же не хочется.
                            4. В файлах hbdbu.hbp, hbide.hbp, hbqtwidgets.hpb и hbxbp.hbp прописать полный путь к hbqt.hbc, а в hbdbu.hbp — и к hbqtwidgets.hpc
                            5. После вылета с ошибкой при линковке hbide.exe переписать две вновь созданные библиотеки: libhbqtwidgets.a и libhbxbp.a в harbour\addons\hbqt\lib\win\mingw\ и запустить процесс еще раз.


                            Посоветовать что-то конкретное по настройке конфигурационных файлов hbmk не могу, потому что сам не использую эту утилиту и знаком с ней только в самых общих чертах. Но с этим надо что-то делать.
                            Я бы, конечно, использовал стандартные make средства. Учитывая, что набор С компиляторов для qtcontribs очень ограничен ( mingw для Windows и gcc для Linux и Mac ), суммарное количество конфигурационных файлов будет меньше, чем сейчас, ну и разобраться будет проще.
                              0
                              hbmk2 очень мощный инструмент — сравним с make
                              а выбор есть, процитирую:
                              лучшая утилита - это та утилита, которую ты знаешь лучше всего
                                0
                                лучшая утилита — это та утилита, которую ты знаешь лучше всего

                                Согласен. Но я бы добавил «и остальные члены команды».
                                Судя по всем перечисленным проблемам, у меня создалось впечатление, что ни Притпал, ни кто другой не владеет hbmk достаточно, чтобы эти проблемы решить.
                                  0
                                  Я столкнулся с тем, что Притпал, допустим, о intellisence в hbide написал в каком-то форуме в 2010 году, кажется, и все.
                                  Нехватка документации сказывается.
                                  Например, вот этот тред обязательно рекомендую прочитать:
                                  groups.google.com/forum/#!topic/qtcontribs/Sn4OEl2yZw4

                                  Приходится самому копать исходники.
                                  Ну собственно, это как минус так и плюс опэнсурса.
                                    0
                                    Дополню

                                    Я столкнулся с тем, что Притпал, допустим, о intellisence в hbide написал в каком-то форуме в 2010 году, кажется, и все.
                                    Нехватка документации сказывается.
                                    Например, вот этот тред обязательно рекомендую прочитать:
                                    Особенность применения сигналов Qt в QtContribs учитывая область видимости привязываемой функции

                                    Может где-то написано и об этих проблемах. Вот сейчас попытался посмотреть код по тем ворнингам, что указывались выше.
                                    Там в hbmk2 константа _HBMK_NEST_MAX = 10, почему может гугл подскажет.

                                    В общем, приходится самому копать исходники.
                                    Ну собственно, это как минус так и плюс опэнсурса.
                                0
                                Нашел книжки. Рекомендую.
                                books

                                Only users with full accounts can post comments. Log in, please.