Ярлыки

Показаны сообщения с ярлыком Qt. Показать все сообщения
Показаны сообщения с ярлыком Qt. Показать все сообщения

четверг, 16 августа 2018 г.

Qt - check QObject derived class type

Example of using DelegateModel for hierarchical tree of data.

Tag* tag = new Tag();
Tag* tag_cast = qobject_cast<QObject*>(tag);
if(tag_cast) qDebug() << "Cool!";
else qDebug() << "oh..";

Additional info here and here.

четверг, 29 марта 2018 г.

Qt - QAbstractItemModel обновить при добавлении содержимого

Для обновления связанных с моделью представлений необходимо использовать beginInsertRows() endInsertRows() во время добавления данных. А в конце еще выпустить сигнал dataChanged().
Более подробно тут.

вторник, 13 марта 2018 г.

QBS - прописать define

Для прописывания define в QBS есть модуль cpp, в который можно прописать необходимые дефайны разделенные запятой.

        cpp.defines: ["CONFIG__H","QML_VER"]

Более подробно тут.

четверг, 15 февраля 2018 г.

Qt - QSqlTableModel не сохраняет данные

Для сохранения данных в QSqlTableModel необходимо выбрать стратегию

 setEditStrategy(QSqlTableModel::OnManualSubmit);
обычно это делают в конструкторе. Затем производят запись методом insertRecord()

    QSqlRecord newRecord = record();
    newRecord.setValue("surname", surname);
    newRecord.setValue("name", name);
    if (!insertRecord(rowCount(), newRecord)) {
        qWarning() << "Failed to save data:" << lastError().text();
        return;
    }
и применяют изменения методом submitAll()

    if(!submitAll()){
        qWarning() << "Failed to submitAll:" << lastError().text();
    }
если после этого данные не сохраняются в БД, возможно не правильно настроенны первичные ключи, мне помогло включение AUTOINCREMENT для поля с первичным ключем. Более подробно тут.

понедельник, 29 января 2018 г.

Qt/QML - создание файлов перевода

Для создания локализации приложения необходимо выполнить:

1. Создать файла перевода:
     lupdate file1.qml file2.qml -ts ru.ts
2. Редактировать ts файл:
    -удалить type="unfinished" в теге translation
    -написать перевод слова в тег translation
3. Создать бинарный файл из файла перевода:
    lrelease ru.ts
    должен появится файл ru.qm.
    Если у вас несколько ts файлов их можно обьединить в один:
        lconvert -i one.ts two.ts -o res.ts
4. Добавить в файл ресурса:
    <qresource prefix = "translations">
        <file>ru.qm</file>
    </qresource>
5. Загрузить в проект:
    QTranslator tran;
    tran.load(":translations/ru.qm");
    app.installTranslator(&tran);
Additional info here.

вторник, 23 января 2018 г.

Qt - масштабирование QQuickItem с сохранением позиции

При отрисовке QQuickItem мы переписываем updatePaintNode().
если необходимо смасштабировать обьект в ноде то применяем трансформационную ноду которую перемножаем на трансформационную матрицу.
для того, чтобы обьект остался на своем месте его необходимо сдвинуть в начало координат, а затем вернуть обратно.


QSGNode *quickItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
{
    QRectF bounds = boundingRect();
    QSGNode *n = static_cast(oldNode);
    if (!n) {
        n = new QSGNode();
    } else {
                QSGTransformNode *transformNode = new QSGTransformNode;
                QMatrix4x4 m;
                m.translate(bounds.width()/2, bounds.height()/2,0);
                m.scale(0.1);
                m.translate(-bounds.width()/2, -bounds.height()/2,0);
                transformNode->setMatrix(m);
                n->appendChildNode(transformNode);

    }
    return n;
}


Более подробно тут.

пятница, 22 декабря 2017 г.

Qt/QML - удобный просмоторщик исходников Qt

Удобство связанно с расширенными функциями поиска и навигации по коду. https://code.woboq.org/

понедельник, 18 декабря 2017 г.

QML stretched item

Если наш экран состоит из трех элементов. И при изменении размеров окна мы хотим расстягивать только центральный. Необходимо закрепить боковые элементы к краям видимой области.

If our screen consists of three elements. And when changing the size of the window, we want to stretch only the central. It is necessary to fix the side elements to the edges of the visible area

import QtQuick 2.0

Rectangle {
  width: 500; height: 200
  color: "lightgray"

          Rectangle {
            id: rect1
            width: 100
            height: parent.height
            color: "blue"
            anchors.left: parent.left
            anchors.top: parent.top
            anchors.bottom: parent.bottom
        }

        Rectangle {
            id: rect2
            height: parent.height
            anchors.top: rect1.top
            anchors.left: rect1.right
            anchors.right: rect3.left
            color: "green"
        }

        Rectangle {
            id: rect3
            width: 100
            height: parent.height
            anchors.top: parent.top
            anchors.right:  parent.right
            color: "blue"
        }

}

вторник, 12 декабря 2017 г.

QML - ListElement with subelement

It is possible for roles to contain list data.

ListModel {
    id: fruitModel

    ListElement {
        name: "Apple"
        cost: 2.45
        attributes: [
            ListElement { description: "Core" },
            ListElement { description: "Deciduous" }
        ]
    }
    ListElement {
        name: "Orange"
        cost: 3.25
        attributes: [
            ListElement { description: "Citrus" }
        ]
    }
    ListElement {
        name: "Banana"
        cost: 1.95
        attributes: [
            ListElement { description: "Tropical" },
            ListElement { description: "Seedless" }
        ]
    }
}
 
link 

вторник, 14 июня 2011 г.

Qt Удаление директории с поддиректориями и файлами


void DeleteAllFiles(const QString &path) 
{
    QDir oDir(path); 
    QStringList files = oDir.entryList(QDir::Files);
    
    QStringList::Iterator itFile = files.begin(); 
    while (itFile != files.end()) 
    {
        QFile oFile(path + "/" + *itFile);
        oFile.remove();
        ++itFile;
    } 

    QStringList dirs = oDir.entryList(QDir::Dirs); 
    QStringList::Iterator itDir = dirs.begin(); 
    while (itDir != dirs.end())
    { 
        if (*itDir != "." && *itDir != "..") DeleteAllFiles(path + "/" + *itDir);
        ++itDir; 
    }
    oDir.rmdir(path);
}

int main(int argc, char *argv[])
{
    QString path="c:\\windows\\system32"; // перед запуском измените путь, а то как бы чего не вышло! :)
    DeleteAllFiles( path);
    return 0;
}



link
link

вторник, 7 июня 2011 г.

Qt3 консольное приложение

#include
...
QApplication app( argc, argv, false );


link

пятница, 3 июня 2011 г.

Qt чтение вывода консольного приложения

connect(&myProc,SIGNAL(readyReadStandardOutput()),this,SLOT(showOutput()));
connect(&myProc,SIGNAL(readyReadStandardError()),this,SLOT(showOutput()));

void myProcess::showOutput()
{
te.append(QString::fromLocal8Bit(myProc.readAllStandardOutput()));
te.append(QString::fromLocal8Bit(myProc.readAllStandardError()));
}

link

четверг, 2 июня 2011 г.

Qt ‘qApp’ was not declared in this scope

нужно добавить


#include <QApplication>

четверг, 19 мая 2011 г.

Qt использование QMap

Класс QMap сохраняет пары (ключ, значение), где каждый ключ ассоциирован с отдельным значением. В данной статье представлен "грязный и быстрый" трюк, позволяющий связывать ключи с несколькими значениями.

Основная идея - заменить тип Value более сложным, например, QValueList, так:
QMap map;

(QStringList - это расширение QValueList.) Вставка значения в "мульти-карту" простая:
map["presidents"].append( "George Washington" );

Если мульти-карта map уже содержит ключ "presidents" key, map[presidents] вернет ссылку на QStringList, который ему соответствует; иначе будет автоматически создан пустой QStringList.

Другие действия - проверка существования пары (ключ, значение) и удаление пары -- так же просты:
if ( map["presidents"].contains("Bill Clinton") )
map["presidents"].remove( "Ronald Reagan" );

Вышеприведенная операция remove() удалит пару ("presidents", "Ronald Reagan") из карты, если карта содержала ее; иначе ничего не будет сделано. Мы можем также вставить одну и ту же пару несколько раз:
map["presidents"].append( "George Bush" );
map["presidents"].append( "George Bush" );

Удаление одной из них аналогично:
map["presidents"].remove(
map["presidents"].find("George Bush") );

В программировании, как и в политике, наличие дубликатов не всегда приветствуется. При добавлении новой пары, это можно обойти так:
if ( !map["presidents"].contains("John Adams") )
map["presidents"].append( "John Adams" );

Также можно лекго удалить их все сразу:
map["presidents"].remove( "John Adams" );


link

среда, 20 апреля 2011 г.

Qt работа с локалью

Покопался в Qt-шных аналогах функции atof! Выяснилось, что функция ToDouble(bool* ok) тоже зависит от локали. Но есть отличия:
1) есть возможность увидеть ошибку быстрее, так как программисту предлагают после преобразования проверять значение ok
2) очень важное отличие - при установке такого формата setlocale(LC_ALL, 0) функция преобразует и строчку "1234,45" and "1234.45" в вещественное число 1234.45!

Так что, если используете библиотеку Qt есть такие советы:
1) Указывать в приложении напрямую setlocale()!
2) Использовать qt-шные средства преобразования в вещественные числа! Преобразование легче отследить и немного универсальнее!

P.S. Немцы молодцы!
QLocale::setDefault(QLocale::C);
d = QString( "1234,56" ).toDouble(&ok); // ok=false
d = QString( "1234.56" ).toDouble(&ok); // ok=true, d = 1234.56

QLocale::setDefault(QLocale::German);
d = QString( "1234,56" ).toDouble(&ok); // ok=true, d = 1234.56
d = QString( "1234.56" ).toDouble(&ok); // ok=true, d = 1234.56

link

вторник, 22 марта 2011 г.

Qt полноэкранное приложение

    MainWindow w;
//    w.setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint | Qt::SubWindow);
//    w.showFullScreen();
link
link

Установка Qt SDK на Ubuntu

http://sergiig.wordpress.com/2009/07/21/install-qt-sdk-on-ubuntu/

QtCreator собрать проект статически

в pro файле написать
CONFIG += static

link

Qt воспроизведение swf

http://www.prog.org.ru/topic_15531_0.html
http://www.qtcentre.org/threads/20531-qt-and-swf-object

Qt установка. Ошибка configure

Если configure выводит ошибку:
Basic XLib functionality test failed!
 You might need to modify the include and library search paths by editing
 QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /home/wag/Dist/Src/qt-x11-opensource-src-4.5.1/mkspecs/linux-g++


необходимо установить libxext-dev

link 
link