Работа с базами данных в Qt

    Qt дает возможность создания платформо-независимых приложений для работы с базами данных, используя стандартные СУБД. Qt включает «родные» драйвера для Oracle, Microsoft SQL Server, Sybase Adaptive Server, IBM DB2, PostgreSQL, MySQL и ODBC-совместимых баз данных. Qt включает специфичные для баз данных виджеты, а также поддерживает расширение для работы с базами данных любых встроенных или отдельно написанных виджетов.

    Введение


    Работа с базами данных в Qt происходит на различных уровнях:
    1.Слой драйверов — Включает классы QSqlDriver, QSqlDriverCreator, QSqlDriverCreatorBase, QSqlDriverPlugin и QSqlResult. Этот слой предоставляет низкоуровневый мост между определенными базами данных и слоем SQL API.
    2.Слой SQL API — Этот слой предоставляет доступ к базам данных. Соединения устанавливаются с помощью класса QSqlDatabase. Взаимодействие с базой данных осуществляется с помощью класса QSqlQuery. В дополнение к классам QSqlDatabase и QSqlQuery слой SQL API опирается на классы QSqlError, QSqlField, QSqlIndex и QsqlRecord.
    3.Слой пользовательского интерфейса — Этот слой связывает данные из базы данных с дата-ориентироваными виджетами. Сюда входят такие классы, как QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel.

    Соединение с базой данных


    Чтобы получить доступ к базе данных с помощью QSqlQuery и QSqlQueryModel, необходимо создать и открыть одно или более соединений с базой данных.
    Qt может работать со следующими базами данных (из-за несовместимости с GPL лицензией, не все плагины поставляются с Qt Open Source Edition):
    1. QDB2 — IBM DB2 (версия 7.1 и выше
    2. QIBASE — Borland InterBase
    3. QMYSQL — MySQL
    4. QOCI — Драйвер Oracle Call Interface
    5. QODBC — Open Database Connectivity (ODBC) — Microsoft SQL Server и другие ODBC-совместимые базы данных
    6. QPSQL — PostgreSQL (версия 7.3 и выше)
    7. QSQLITE2 — SQLite версии 2
    8. QSQLITE — SQLite версии 3
    9. QTDS — Драйвер Sybase Adaptive Server

    Для сборки плагина драйвера, которые не входят в поставку Qt нужно иметь соответствующую клиентскую библиотеку для используемой СУБД.

    Соединиться с базой данных можно вот так:
    1.    QSqlDatabase db = QsqlDatabase::addDatabase("QMYSQL", "mydb");
    2.    db.setHostName("bigblue");
    3.    db.setDatabaseName("flightdb");
    4.    db.setUserName("acarlson");
    5.    db.setPassword("1uTbSbAs");
    6.    bool ok = db.open();
    * This source code was highlighted with Source Code Highlighter.

    Первая строка создает объект соединения, а последняя открывает его. В промежутке инициализируется некоторая информация о соединении, включая имя соединения, имя базы данных, имя узла, имя пользователя, пароль. В этом примере происходит соединение с базой данных MySQL flightdb на узле bigblue. Аргумент «QMYSQL» в addDatabase() указывает тип драйвера базы данных, чтобы использовать для соединения, а «mydb» — имя соединения.
    Как только соединение установлено, можно вызвать статическую функцию QSqlDatabase::database() из любого места программы с указанием имени соединения, чтобы получить указатель на это соединение. Если не передать имя соединения, она вернет соединение по умолчанию.
    Если open() потерпит неудачу, он вернет false. В этом случае, можно получить информацию об ошибке, вызвав QSqlDatabase::lastError().
    Для удаления соединения с базой данных, надо сначала закрыть базу данных с помощью QSqlDatabase::close(), а затем, удалить соединение с помощью статического метода QSqlDatabase::removeDatabase().

    Выполнение инструкций SQL


    Класс QSqlQuery обеспечивает интерфейс для выполнения SQL запросов и навигации по результирующей выборке.
    Для выполнения SQL запросов, просто создают объект QSqlQuery и вызывают QSqlQuery::exec(). Например, вот так:
    1.    QSqlQuery query;
    2.    query.exec("SELECT name, salary FROM employee WHERE salary > 50000");
    * This source code was highlighted with Source Code Highlighter.

    Конструктор QSqlQuery принимает необязательный аргумент QSqlDatabase, который уточняет, какое соединение с базой данных используется. Если его не указать, то используется соединение по умолчанию.
    Если возникает ошибка, exec() возвращает false. Доступ к ошибке можно получить с помощью QSqlQuery::lastError().
    QSqlQuery предоставляет единовременный доступ к результирующей выборке одного запроса. После вызова exec(), внутренний указатель QSqlQuery указывает на позицию перед первой записью. Если вызвать метод QSqlQuery::next() один раз, то он переместит указатель к первой записи. После этого необходимо повторять вызов next(), чтобы получать доступ к другим записям, до тех пор пока он не вернет false. Вот типичный цикл, перебирающий все записи по порядку:
    1.    while (query.next()) {
    2.      QString name = query.value(0).toString();
    3.      int salary = query.value(1).toInt();
    4.      qDebug() << name << salary;
    5.    }
    * This source code was highlighted with Source Code Highlighter.

    QSqlQuery может выполнять не только SELECT, но также и любые другие запросы. Следующий пример вставляет запись в таблицу, используя INSERT:
    1.    QSqlQuery query;
    2.    query.exec("INSERT INTO employee (id, name, salary) "
    3.         "VALUES (1001, 'Thad Beaumont', 65000)");
    * This source code was highlighted with Source Code Highlighter.

    Если надо одновременно вставить множество записей, то зачастую эффективней отделить запрос от реально вставляемых значений. Это можно сделать с помощью вставки значений через параметры. Qt поддерживает два синтаксиса вставки значений: поименованые параметры и позиционные параметры. В следующем примере показана вставка с помощью поименованного параметра:
    1.    QSqlQuery query;
    2.    query.prepare("INSERT INTO employee (id, name, salary) "
    3.           "VALUES (:id, :name, :salary)");
    4.    query.bindValue(":id", 1001);
    5.    query.bindValue(":name", "Thad Beaumont");
    6.    query.bindValue(":salary", 65000);
    7.    query.exec();
    * This source code was highlighted with Source Code Highlighter.

    В этом примере показана вставка с помощью позиционного параметра:
    1.    QSqlQuery query;
    2.    query.prepare("INSERT INTO employee (id, name, salary) "
    3.           "VALUES (?, ?, ?)");
    4.    query.addBindValue(1001);
    5.    query.addBindValue("Thad Beaumont");
    6.    query.addBindValue(65000);
    7.    query.exec();
    * This source code was highlighted with Source Code Highlighter.

    При вставке множества записей требуется вызвать QSqlQuery::prepare() только однажды. Далее можно вызвать bindValue() или addBindValue() с последующим вызовом exec() столько раз, сколько потребуется.

    Отображение данных в таблице-представлении


    Классы QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel могут использоваться в качестве источников данных для классов представлений Qt, таких как QListView, QTableView и QTreeView. На практике наиболее часто используется QTableView в связи с тем, что результирующая SQL выборка, по существу, представляет собой двумерную структуру данных.
    В следующем примере создается представление основанное на модели данных SQL:
    1.    QSqlTableModel model;
    2.    model.setTable("employee");
    3.    QTableView *view = new QTableView;
    4.    view->setModel(&model);
    5.    view->show();
    * This source code was highlighted with Source Code Highlighter.

    Если модель является моделью для чтения-записи (например, QSqlTableModel), то представление позволяет редактировать поля. Это можно отключить с помощью следующего кода
    1.    view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    * This source code was highlighted with Source Code Highlighter.

    Можно использовать одну и ту-же модель в качестве источника данных для нескольких представлений. Если пользователь изменяет данные модели с помощью одного из представлений, другие представления немедленно отобразят изменения.
    Классы-представления для обозначения колонок наверху отображают заголовки. Для изменения текста заголовка, используется функция setHeaderData() модели. Например:
    1.    model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
    2.    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
    3.    model->setHeaderData(2, Qt::Horizontal, QObject::tr("City"));
    4.    model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));
    * This source code was highlighted with Source Code Highlighter.


    Заключение


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

    UPD: поправил ошибки в коде.
    Поделиться публикацией

    Комментарии 89

      +2
      Спасибо. С каждым разом все больше вовлекаюсь в QT и Python :)
      • НЛО прилетело и опубликовало эту надпись здесь
          0
          А зачем? Исключение вызывается внутри exec(), там же оно и обрабатывается. Если бы функция вызывала исключение, то каждый раз пришлось бы писать обработчик самому, иначе бы необработанное исключение ушло бы к операционной системе, которая просто бы прибила программу.
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              Сравните:
              if (!query.exec("...")) {
              //сообщение об ошибке и все что нашей душе угодно

              }
              • НЛО прилетело и опубликовало эту надпись здесь
                  +1
                  Никто не мешает вам написать в Qt Software письмо о том, что вы не довольны их реализацией работы с базами данных :)
                    0
                    А мне очень нравится, что кутэшники везде применяют самый простой метод. Никаких шаблонов, почти нет исключений… красота, очень сложно после qt3-4 изучать запутанные библиотеки типа boost.
                      0
                      ну по поводу шаблонов вы погорячились;) они там широко используются
                        +1
                        но по сравнению с бустом — их и в самом деле почти нет, и, если не ошибаюсь, кроме кутэшных контейнеров они мало где используются
                          0
                          это да, но данные контейнеры используются практически всегда… ну или некоторые как я по старинке используют СТЛ-контейнеры
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          поймите вы, это разные подходы;) они ничем ни лучше и не хуже друг друга;) просто где-то применяется одно, где-то другое… но внутри одной библиотеки надо использовать только один подход, иначе можно запутаться
                    0
                    Дык это ж ООП, никто не мешает из result == false сделать throw exception ;), если надо.
                  0
                  В Qt не принято использования исключений для обработки ошибок. Так повелось.
                  • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      а аргументировать?
                        0
                        или вы считаете что d-поинтеры, которые являются частью внутрикорпоративного стандарта QtSoftware и KDE тоже пипец?
                        • НЛО прилетело и опубликовало эту надпись здесь
                        • НЛО прилетело и опубликовало эту надпись здесь
                          • НЛО прилетело и опубликовало эту надпись здесь
                              0
                              Очень просто не интерперабельно. Не для всех платформ где есть Qt это поддерживалось, на многих платформах компилатор С++ — это С с класами и примитивной поддержкой шаблонов, для реализации контейнеров.
                              0
                              Это не «пипец», а стиль, вырабатываемый годами. На прикладном уровне в Qt никто исключений не использует и все живут счастливо. Кроме того, в некоторых ситуациях это повышает производительность и упрощает портирование на разные платформы.
                          0
                          ну вот, опять перевод ассистанта;( оно конечно полезно, но даже не поставлено что это перевод;(
                            +1
                            да и хочется то читать не переводы оф документации, а что-то свое с объяснениям каких-нить подводных камней
                              0
                              Это не точный перевод, в нем многое изменено, поэтому ставить что это перевод бессмысленно
                                0
                                хм, ну каждую строку не сравнивал, но общие черты текста и примеры те же что в ассистанте… ну да не спорю, выкинуто примерно треть статьи ассистанта. Причем надо заметить выкинута достаточно вкусная часть
                                  0
                                  В заключении про самую вкусную часть написано… Статья и так получилась не маленькая.
                                    0
                                    зато нигде не написано самого первого подводного камня работы с БД, на который натыкаются все кто плохо читает ассистант… я про использование одного подключения из нескольких потоков…
                                      0
                                      Если вы на этот подводный камень уже наткнулись, то я предлагаю написать данную статью вам
                                        0
                                        я просто пытаюсь повернуть вашу творческую деятельность из направления «смотрим что есть в ассистанте, переводим это, делаем некоторые правки, выпускаем в свет» в направление «берем некую проблему, пишем по ней статью, смотрим что есть в ассистанте на данную тему, дополняем инфой из ассистанта, выпускаем в свет»
                                          0
                                          Не надо поворачивать мою творческую деятельность. Лучше продемонстрируйте свою
                              +1
                              QSqlQuery query;
                              query.exec(«SELECT name, salary FROM employee WHERE salary > 50000»);

                              QSqlQuery может выполнять любые SQL выражения, кроме SELECT.

                              тогда где логика примера?
                                0
                                Тут фраза немного корявая получилась, имелось в виду, что
                                QSqlQuery может выполнять не только SELECT, но также и любые SQL. Спасибо за замечание, сейчас поправлю.
                                0
                                Статья конечно хорошая, но мне кажется интереснее было бы поговорить о работе с БД в реальных задачах.
                                Например экспорт и импорт больших объектов, способы автоматизации генерации DML и т.д.
                                Сам недавно столкнулся с этим и достаточно долго искал пути решения.
                                Если найду время, то обязательно расскажу.
                                  0
                                  Будет очень интересно почитать про это, жду с нетерпением
                                  –1
                                  Спасибо за копипаст.
                                    0
                                    Пожалуйста. (Takeji aka Kagami)
                                    0
                                    спасибо.
                                    хотелось бы почитать еще про то, как писать многопоточные приложения с Qt.
                                      0
                                      Думаю это будет многим интересно. Хорошо, я постараюсь написать про это
                                        0
                                        да, штука интересная, но желательно пойти дальше чем перевод QThread асистанта (за переводы, конечно, плюс большой — дело полезное и не простое)
                                          0
                                          Я постараюсь :)
                                      –3
                                      Эта статья убедила меня никогда не использовать Qt для работы с СУБД.

                                      Спасибо.
                                        0
                                        Почему же? Мне кажется такие комментарии необходимо как-то аргументировать.
                                          0
                                          Начнем по порядку.

                                          C++, с его прямым доступом к памяти и ручным же управлением ей не подходит для разработки глобально-надежных пользовательских приложений. (Разумеется, возможно написать надежное приложение на Си++, но это очень сложно: неужели, если у Вас есть возможность использовать другой, более надежный язык, Вы возьмете Си++?)

                                          Несмотря на всю внешнюю причесанность Qt (наверное, и внутреннюю тоже — я туда не заглядывал), костыли прямо прут из всех щелей. Какой-то MOC*, какой-то QtScript, какой-то свой собственный, лисапедный database connectivity. А меня, например, это решение не устраивает, и что теперь, прикручивать/прибивать гвоздями сбоку другую библиотеку?

                                          Qt вообще поражает зацикленностью на себя. Зачем там это все? Qt блины, часом, не готовит?

                                          К тому же, тот же HDBC поддерживает многопоточную обработку, а тут — на тебе, низзя. Нехорошо, товарищи.

                                          PS школота минусов наставила, just as planned.

                                          * языковых средств Си++ не хватает, по всей видимости, для реализации настоящего, тру-метаобъектного протокола. Хотя в том же Лиспе это есть уже 50 лет. Тьюринг-полные шаблоны, ау?
                                            0
                                            Для примерно 2/3 задач (например для написания обычного пользовательского приложения с некоторым количеством математики/многопоточности/чего-нить еще) я предпочту С++.
                                            Чем вас не устраивает МОК?
                                            Что вам не нравится в возможности написать без излишних проблем приложение с возможностью его модернизирования скриптами, без вмешательства в код?
                                            Чем вас не устраивает работа с БД?
                                            Если вас не устраивает такая работа с БД, никто не мешает прилинковать свою либу, забыть про QtSql и спокойно пейсать.
                                            Если вы не помните, то Qt — фреймворк, следовательно он должен включать максимально охватывающий функционал. Например в 4.6 будет стейт машина и либа для простого управления анимацией (Кинетик). Чем это плохо?
                                            Многопоточная обработка возможна если вы хотя бы немножко вникните в суть написания приложений на Куте, то поймете что многопоточная работа с одним подключением к БД делается несложно и в рамках общих стандартов программироваия на Куте.
                                              0
                                              > Для примерно 2/3 задач (например для написания обычного пользовательского приложения с некоторым количеством математики/многопоточности/чего-нить еще) я предпочту С++.

                                              Это смотря для каких задач. Си++ годится только для performance-critical кода (ладно, вероятно, 10-15 лет назад это было не так). То, что на нем залабали такую нехилую штуку как Qt, называется abuse.

                                              > Чем вас не устраивает МОК?

                                              Usability нулевой. Как-то не хочется вставлять «этот макрос сюды, тот макрос туды, иначе не заработает».

                                              > Что вам не нравится в возможности написать без излишних проблем приложение с возможностью его модернизирования скриптами, без вмешательства в код?

                                              Я бы скорее написал основу приложения на скрипте, нашел bottleneck'и профилировщиком, и медленные функции вынес в Си++. Так оно кошернее.

                                              > Чем вас не устраивает работа с БД?

                                              Слабенькие гарантии дает. Ну это, в принципе, почти у всех так. Слава Б-гу, что хоть в том же .NET осилили LINQ (хотя сама идея стара как мир).

                                              > Если вы не помните, то Qt — фреймворк, следовательно он должен включать максимально охватывающий функционал.

                                              Если он будет готовить мне кофе (во время компиляции исходников), то я, пожалуй, возьму два. :)

                                              > Например в 4.6 будет стейт машина и либа для простого управления анимацией (Кинетик). Чем это плохо?

                                              Это feature creep. Ну хоть кто-нибудь может определить границы применимости этого фреймворка? Какие задачи он решает? Какие не решает? (это не менее важный вопрос)

                                              > Многопоточная обработка возможна если вы хотя бы немножко вникните в суть написания приложений на Куте, то поймете что многопоточная работа с одним подключением к БД делается несложно

                                              А я хочу юзать STM. Это возможно в Qt?

                                              > и в рамках общих стандартов программироваия на Куте.

                                              Опять стандарты, господи…
                                                0
                                                вам может и годится для критикал кода, а по мне так для всего годится…

                                                «Usability нулевой. Как-то не хочется вставлять «этот макрос сюды, тот макрос туды, иначе не заработает».»
                                                ну эм… как бы сказать… а что должно все везде включено? тогда это будет нехилый оверхед…

                                                «Я бы скорее написал основу приложения на скрипте, нашел bottleneck'и профилировщиком, и медленные функции вынес в Си++. Так оно кошернее.»

                                                Вы видимо не поняли… вот я написал некое ПО… а уже пользователи спокойно могут писать дополнения к нему с помощью QtScript'а… не лезя в исходники самого ПО…

                                                покажите мне фреймворк который варит кофе;) ну или хотя бы воду кипятит;)

                                                «Ну хоть кто-нибудь может определить границы применимости этого фреймворка? Какие задачи он решает? Какие не решает? (это не менее важный вопрос)»

                                                Основная направленность — прикладное кросс-платформенное ПО. Или вам по пунктам подробно? ну тогда сами, ибо это мартышкин труд

                                                «А я хочу юзать STM. Это возможно в Qt?»

                                                Что вы имеете в виду под STM?

                                                «Опять стандарты, господи…»
                                                Вы таки против стандартов? совсем против стандартов?
                                                  –2
                                                  > ну эм… как бы сказать… а что должно все везде включено? тогда это будет нехилый оверхед…

                                                  [irony]Какой оверхед, у нас же самый шустрый ЯП в мире!1[/irony] Если честно, то при выборе правильной абстракции от оверхеда можно избавиться, так все нормальные люди делают. Яркий пример: Фортран.

                                                  > Вы видимо не поняли… вот я написал некое ПО… а уже пользователи спокойно могут писать дополнения к нему с помощью QtScript'а… не лезя в исходники самого ПО…

                                                  А в чем прикол писать приложение на Си++, затем приколачивать скрипт сбоку, если можно сразу взять скрипт? :)

                                                  > покажите мне фреймворк который варит кофе;) ну или хотя бы воду кипятит;)

                                                  Qt! %)

                                                  > Основная направленность — прикладное кросс-платформенное ПО.

                                                  Слишком размытая формулировка.

                                                  > Что вы имеете в виду под STM?

                                                  Software transactional memory же. Читайте «Composable memory transactions» (Tim Harris et al.)

                                                  > Вы таки против стандартов? совсем против стандартов?

                                                  Да, я против стандартов. Их пишут умалишенные идиоты. Есть, конечно, исключения — это когда один человек все придумывает, а не комитет (вот такие стандарты нужны, но их мало).
                                                    –1
                                                    «Если честно, то при выборе правильной абстракции от оверхеда можно избавиться, так все нормальные люди делают.»
                                                    Ну приведите пример чтоле.

                                                    «А в чем прикол писать приложение на Си++, затем приколачивать скрипт сбоку, если можно сразу взять скрипт? :)»

                                                    вы читаете через слово или как? основной тезис — модульность… какая к чертям собачьим разница компилируемый язык или интерпретируемый у изначальной проги? КутеСкрипт облегчает реализацию функционала модульности.

                                                    «Слишком размытая формулировка.»
                                                    Какой вопрос такой и ответ. Какая направленность у того же дотНета? каких-то конкретных фраз тут не напишешь, только в общем виде.

                                                    «Software transactional memory же.»
                                                    Судя по википедии есть немало сишных либ… кто мешает их прилинковать и использовать? или же вы хотите чтобы при этом были бнз каких-то проблем доступны все вкусности Куте? ну тогда Куте не для вас… как собственно и любой другой фреймворк…

                                                    «Да, я против стандартов. Их пишут умалишенные идиоты. Есть, конечно, исключения — это когда один человек все придумывает, а не комитет (вот такие стандарты нужны, но их мало).»
                                                    То есть когда один человек пишет стандарт то это зашибись, а когда он проходит несколько стадий проверок неким количеством людей то это отстой? я не вижу логики
                                                      –1
                                                      >> Если честно, то при выборе правильной абстракции от оверхеда можно избавиться, так все нормальные люди делают.
                                                      > Ну приведите пример чтоле.

                                                      Fortran. Уже первый его компилятор генерировал код, сопоставимый по качеству ассемблеру (написанному вручную). Таких примеров вагон и тележка, токо вот зашоренные Цппшники их в упор не замечают.

                                                      >основной тезис — модульность… какая к чертям собачьим разница компилируемый язык или интерпретируемый у изначальной проги?

                                                      В принципе, без разницы, но известно, что динамическая типизация способствует loose coupling. Подгрузка кода в райнтайме у статически типизированных языков обычно плачевная (бывают и исключения: советую посмотреть hs-plugins, dynamics у Clean, AliceML).

                                                      > Какой вопрос такой и ответ. Какая направленность у того же дотНета? каких-то конкретных фраз тут не напишешь, только в общем виде.

                                                      У .NET'а нет направленности, он не решает каких-то проблем, только создает новые. Это маркетоидная муть.

                                                      > Судя по википедии есть немало сишных либ… кто мешает их прилинковать и использовать?

                                                      Они не дают важных гарантий.

                                                      > или же вы хотите чтобы при этом были бнз каких-то проблем доступны все вкусности Куте?

                                                      Да.

                                                      > ну тогда Куте не для вас… как собственно и любой другой фреймворк…

                                                      Это неправильно, не находите? :)

                                                      > То есть когда один человек пишет стандарт то это зашибись, а когда он проходит несколько стадий проверок неким количеством людей то это отстой?

                                                      Да, так оно и есть. Здесь на хабре simonsays писал как раз об этом явлении.

                                                      > я не вижу логики

                                                      Принимать решения должен один человек. Да, он может посоветоваться с другими, но окончательное решение все равно принимает он и только он.
                                                        0
                                                        Ну а текущие компиляторы сей генерят код, лучше которого фиг напишешь на асме (только если действительно очень хорошо рубишь в асме). И чо?

                                                        «Подгрузка кода в райнтайме у статически типизированных языков обычно плачевная „
                                                        Причем здесь подгрузка кода? QtScript не подгружается а интерпретируется…

                                                        “Это неправильно, не находите? :)»
                                                        Нет не нахожу… точно также как не нахожу что линукс должен подходить даже для домохозяйки… у каждого продукта есть своя аудитория и если ее пытаться расширить, то будет кака…

                                                        «Принимать решения должен один человек. Да, он может посоветоваться с другими, но окончательное решение все равно принимает он и только он.»
                                                        Обычно в комиссиях по стандартам есть некое лицо, которое является главным и по сути принимает решение именно он, остальные являются помощниками
                                                          0
                                                          > Ну а текущие компиляторы сей генерят код, лучше которого фиг напишешь на асме (только если действительно очень хорошо рубишь в асме).

                                                          FUD. Быстренько бежим сравнивать скорость исполнения какого-нибудь DSL vs C. Hints: CDuce vs ???, SISAL vs ???, etc. В прынцыпе, тот же Лисп вполне может обогнать Си на символьных вычислениях, скажем.

                                                          > Причем здесь подгрузка кода? QtScript не подгружается а интерпретируется…

                                                          Вопрос: как обеспечить расширяемость программы? Ответ: дать возможность загружать новый код во время выполнения программы. Какая разница, интерпретируется ли этот код потом в VM или на железе? :)

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

                                                          Продолжая мысль, понимаем, что Куте токо для зашоренных Цппшников. Ну явный же бред.

                                                          > Обычно в комиссиях по стандартам есть некое лицо, которое является главным и по сути принимает решение именно он, остальные являются помощниками

                                                          Значит там действительно умалишенные идиоты сидят. Фейлов от W3C уже достаточно. Чего стоит тот же DOM. ;)
                                                            0
                                                            про компилер я ответил на ваше непонятное заявление о фортране…

                                                            «Вопрос: как обеспечить расширяемость программы? Ответ: дать возможность загружать новый код во время выполнения программы. Какая разница, интерпретируется ли этот код потом в VM или на железе? :)»

                                                            большая… если мы делаем ПО на том же руби без поддержки неокторого скриптового языка для модулей, то единственная возможность расширить функционал это переписывание исходников… следовательно совместить мое расширение и расширение дяди Пети будет ой как не просто…
                                                            если мы делаем ПО без разницы на чем, но с поддержкой скриптового языка для модулей, то мы просто подгружаем мой модуль и модуль дяди Пети и все зашибись…

                                                            «Продолжая мысль, понимаем, что Куте токо для зашоренных Цппшников. Ну явный же бред.»
                                                            Нет. Куте для тех, кто понимает зачем ему оно нужно… все остальные могут идти лесом…

                                                            «Значит там действительно умалишенные идиоты сидят. Фейлов от W3C уже достаточно. Чего стоит тот же DOM. ;) „
                                                            Чем вам ДОМ не угодил я не понимаю… вполне себе нормальная модель
                                                              0
                                                              > большая… если мы делаем ПО на том же руби без поддержки неокторого скриптового языка для модулей, то единственная возможность расширить функционал это переписывание исходников…

                                                              На руби вполне можно eval'ить код. Попробуйте, может, понравится. :) (Неужели написание и расширение программы на одном языке не укладывается в голову?)

                                                              > Нет. Куте для тех, кто понимает зачем ему оно нужно… все остальные могут идти лесом…

                                                              Ыыыы. :)

                                                              > Чем вам ДОМ не угодил я не понимаю… вполне себе нормальная модель

                                                              Если бы DOM был и вправду хорош, его бы так часто не оборачивали. И дело тут не только в кроссбраузерности, но и в абсолютной неюзабельности DOM.

                                                              Вот реально, неужели Вам нравится, например, обходить дерево документа средствами DOM? :)
                                                                0
                                                                «На руби вполне можно eval'ить код. Попробуйте, может, понравится. :) (Неужели написание и расширение программы на одном языке не укладывается в голову?)»

                                                                ага и тут мы начисто забываем о безопасности… аффигеть

                                                                «Вот реально, неужели Вам нравится, например, обходить дерево документа средствами DOM? :) „

                                                                меня вполне устраивает ДОМ-модель
                                                                  0
                                                                  > ага и тут мы начисто забываем о безопасности… аффигеть

                                                                  Безопасность тут вопрос касательный. Вполне можно обеспечить sandbox для кода. Кстати, в случае со связкой Цпп + скрипт безопасность это такая же точно проблема.

                                                                  > меня вполне устраивает ДОМ-модель

                                                                  Это ни в коем случае не отменяет ее кривизны. :)
                                                                    0
                                                                    в случае QtScript'а программист сам решает что скрипт сможет а что нет…
                                                                    а сендбокс ведь надо еще делать… а тут все уже готовое… где же ваш хваленый код реюз?;)
                                                                      0
                                                                      > а сендбокс ведь надо еще делать… а тут все уже готовое… где же ваш хваленый код реюз?;)

                                                                      Это Вы привели в пример Ruby. Сами с ним теперь разбирайтесь. :)

                                                                      ЗЫ слив засчитан.
                                                                        0
                                                                        ок, а где не надо делать сендбокс и при этом легко сделать модульность?

                                                                        слив незасчитан, потому что вы конкретного ничего не сказали… все ваши высказывания сводятся к:
                                                                        1. куте отстой
                                                                        2. цпп отстой
                                                                        3. скриптовые языки рулят

                                                                        но ничего более конкретного нету
                                                                          0
                                                                          > ок, а где не надо делать сендбокс и при этом легко сделать модульность?

                                                                          Те же D, Haskell.

                                                                          > 1. куте отстой

                                                                          Qt это пример неправильного выбора языка и у него есть свои минусы. То, что Qt отстой я нигде не говорил.

                                                                          > 2. цпп отстой

                                                                          Увы, да. Точнее будет сказать, что Цпп плохо справляется и с низкоуровневыми, и с высокоуровневыми задачами. В первом случае сливает Си и Форту, во втором сливает скриптовым и некоторым компилируемым ЯП.

                                                                          > 3. скриптовые языки рулят

                                                                          Где я такое говорил?

                                                                          > но ничего более конкретного нету

                                                                          Учитесь мыслить абстрактно. Это тяжело, я знаю.

                                                                          Кстати, а Вы ждали, что я начну кидаться кусками кода? :)
                                                                            0
                                                                            Немного конкретики по sandbox'ам.

                                                                            У D есть SafeD, в Haskell никто не мешает сконструировать свой собственный, ограниченный вариант IO-монады.
                                                                              0
                                                                              мда, я забыл сказать что языки хотелось бы услышать уж если не мейнстрим, то широко-распространенные…

                                                                              «Qt это пример неправильного выбора языка и у него есть свои минусы. То, что Qt отстой я нигде не говорил.»

                                                                              куте есть не только на цпп

                                                                              «Увы, да. Точнее будет сказать, что Цпп плохо справляется и с низкоуровневыми, и с высокоуровневыми задачами. В первом случае сливает Си и Форту, во втором сливает скриптовым и некоторым компилируемым ЯП.»
                                                                              это ваше имхо? если да, то не стоит его говорить как божье откровение
                                                                              если нет, то аргментируйте

                                                                              «Учитесь мыслить абстрактно. Это тяжело, я знаю.»
                                                                              вы просили от меня конкретики, я вам ее дал… почему же вы не можете дать конкретику?
                                                                                0
                                                                                > куте есть не только на цпп

                                                                                Qt реализован на Си++, биндинги есть и на другие ЯП, да.

                                                                                > это ваше имхо? если да, то не стоит его говорить как божье откровение. если нет, то аргментируйте

                                                                                Поизучайте другие языки, и Вам это тоже станет ясно. Пока Вы сами не поймете этого, никто Вам это объяснить не сможет. Синдром Блаба называется (http://www.paulgraham.com/avg.html).
                                                                                  0
                                                                                  ну скажем так… мне хватает тех языков что я знаю… и сталкивался я не только с императивными языками…

                                                                                  и знаете что мне еще не понятно…
                                                                                  а зачем вы пришли в статью о том как что-то делается в некоем фреймворке написанном на так нелюбимом и неприменяемом вами языке, чтобы покричать какое тут все отстой и что декларативка рулит? ну тогда советую для этого завести отдельную тему…
                                                                                    0
                                                                                    Давайте еще на личности перейдем.

                                                                                    > и знаете что мне еще не понятно… а зачем вы пришли в статью о том как что-то делается в некоем фреймворке написанном на так нелюбимом и неприменяемом вами языке, чтобы покричать какое тут все отстой и что декларативка рулит?

                                                                                    Спасать утопающих. Иногда хочется для людей полезное что-нить сделать. Рассказать, что не С++ом единым, etc.

                                                                                    А в этой статье много «как» и мало «что». А вот это самое «что» должно быть в первую очередь.

                                                                                    PS сим удостоверяю, что все мои посты — это ИМХО. :)
                                                                                      0
                                                                                      вы первый начали переходить на личности;)

                                                                                      и потом тут все люди умные… и знают что не С++ единым… просто для каждой цели есть свое решение. И императивка подходит для большинства задач.
                                                        –1
                                                        PS ололо, школота опять минусует!1
                                                          0
                                                          ничо, меня тоже минусуют, не вы один такой;)
                                                  0
                                                  Кстати про многопоточность, в том же 4.6 будет официально включен QtConcurrent — более простой реализации многопоточности я ещё не видел.
                                                  MOC — это всего лишь прероцессор и ничего более. На выходе из него получаем всё тот же C++ код, который потом передаётся компилятору. Создан он исключительно для удобства.
                                                  Кстати у Qt одна из лучших систем документации, причем не только из C++ проектов.

                                                  А прикручивать что-то стороннее здесь не сложнее чем в любой другой C++ библиотеки, да и вообще в любом другом ЯП.

                                                  P.S. а по поводу «школоты» вы совсем погорячились.
                                                    0
                                                    Конкуррент уже в 4.4 как бе есть
                                                      0
                                                      и еще по поводу конкуррента… он удобен только для распараллеливания мат. алгоритмов или каких-то шаблонных задач… а например для действительно мнгопоточного приложения (где каждый поток является достаточно серьезным и самодостаточным), либо для приложения с фабрикой потоков все таки лучше остаться на QThread
                                                        0
                                                        Полностью с вами согласен. По поводу версии оговорился.
                                                        0
                                                        QtConcurrent это подобие MapReduce, годится не для всех алгоритмов.

                                                        QtThread это платформонезависимая обертка над системными потоками. (Сужу по документации.) Таких оберток целая куча, зачем в Qt изобрели еще одну, мне непонятно.

                                                        > MOC — это всего лишь прероцессор и ничего более. На выходе из него получаем всё тот же C++ код, который потом передаётся компилятору. Создан он исключительно для удобства.

                                                        Я надеюсь, это хотя бы не макроподстановщик Си? :)

                                                        > Кстати у Qt одна из лучших систем документации, причем не только из C++ проектов.

                                                        Да, заметил. Нет, правда, мне нравится. :)

                                                        > а по поводу «школоты» вы совсем погорячились.

                                                        Ну прям. Это же очевидный факт: большей частью Хабранаселения являются школьники.
                                                          –1
                                                          «QtThread это платформонезависимая обертка над системными потоками. (Сужу по документации.) Таких оберток целая куча, зачем в Qt изобрели еще одну, мне непонятно.»

                                                          А зачем в каждом фреймворке есть своя либа для многопоточности? очевидно для лучшей совместимости и интеграции
                                                            0
                                                            > А зачем в каждом фреймворке есть своя либа для многопоточности? очевидно для лучшей совместимости и интеграции

                                                            [trolling]Интеграции с кем? С самим фреймворком? Ну это же на грани. Авторы сами с собой договориться не могут?[/trolling]

                                                            Еще раз повторяю: code reuse это не пустой звук. Как жаль, что до программистов на мейнстримовых языках это еще не дошло.
                                                              –1
                                                              ну на троллинг я отвечать не буду;) ибо троллинг;)

                                                              «Еще раз повторяю: code reuse это не пустой звук. Как жаль, что до программистов на мейнстримовых языках это еще не дошло.»
                                                              А никто и не говорит что это пустой звук… просто излишний код реюз и хватание того что уже кем-то реализовано без оглядки на всю систему это извините бред
                                                                0
                                                                > просто излишний код реюз и хватание того что уже кем-то реализовано без оглядки на всю систему это извините бред

                                                                Ну а NIH, это, извините, щастие?

                                                                Кстати, если уж «бред», то огласите весь список причин не использовать хорошо отлаженный, работающий как часы чужой код.
                                                                  0
                                                                  причина одна… то что он чужой, следовательно его нужно либо пилить под себя, либо пилить свою систему под него
                                                                    0
                                                                    Да, конечно, текущее положение вещей в мейнстримов языках таково.

                                                                    С другой стороны, это неправильно. Я надеюсь, что натолкнул Вас на мысль, что код нужно писать так, чтобы его легко можно было комбинировать с другим кодом.
                                                                      0
                                                                      гыгыгыгы… правильно давайте будем писать оверхед чтобы некий дядя Вася потом смог без проблем внедрить мою либу в свой фреймворк без лишних проблем… вы поймите что любая либа делает то что она делает, и лишняя совместимость с неизвестно чем это офигенный оверхед
                                                                        0
                                                                        Мдя. Аргументы кончились штоле?
                                                                          0
                                                                          нет не закончились, просто оверхед при этом реально будет…
                                                  0
                                                  Отличная и очень полезная статья!
                                                  Без вопросов в избранное и на выходных пробовать, пробовать, пробовать.
                                                    0
                                                    Здравствуйте, Уважаемые хабралюди и знатоки Qt.
                                                    Не так давно начал изучение Qt.
                                                    Всё очень нравится, но!
                                                    Работа с базами реализована хорошо, но возникла проблема при работе с QOCI.
                                                    QSqlTableModel никак не хочет работать, хоть что хочешь делай! Пишет что ошибок нет, а результат пустой.
                                                    QSqlQueryModel — превосходно работает, т.е. сиквел выполняется, но хотелось использовать QSqlTableModel, со всеми его вкусностями.

                                                    Подскажите куда копать…
                                                    P.S. Сервер Oracle 9i, Qt 4.4.3 qt-win-commercial-vs2008
                                                      0
                                                      Так сказать очень сложно, надо на исходники взглянуть. Могу лишь посоветовать начать писать небольшую программу с QSqlTableModel с нуля, постепенно ее усложняя. Это лучший способ разобраться
                                                        0
                                                        Спасибо за совет.
                                                        Разобрался. Оказалось, что когда использую тригеры, то не работает, убрал тригер, всё заработало.

                                                        Вот тригер, может дело в нём?

                                                        create or replace trigger district_type_bi before insert on district_type referencing new as new old as old for each row
                                                        begin
                                                        if :new.id is null then select seq_district_type.nextval into :new.id from dual; end if;
                                                        :new.log:=new log_type(user,sysdate);
                                                        end;
                                                        /
                                                          0
                                                          Рад что проблему удалось локализовать. К сожалению дел с Ораклом не имел, так что ничего не могу сказать по данному вопросу. Думаю в данном случае опять следует идти от простого к более сложному. Создать простой триггер и постепенно усложнять его.
                                                      0
                                                      Просмотрел кучу сайтов, никто так и не написал про инклуды

                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                      Самое читаемое