LINUX.ORG.RU

QML - как готовить?

 ,


1

10

Недавно решил освоить эту технологию, из полученного опыта вынес:

QML 1.*: вообще не готово к использованию - нет базовых элементов для ui, вроде textarea или списков и еще много чего. В интернете и в документации есть примеры реализации недостающих компонентов в отдельных .qml-файлах, но это неудобно и дико в 21 веке.

QML 2.*: появились встроенные TextArea, реализована настройка компонентов при помощи стилей, но это настолько негибко, нет полного контроля, что проще создать свой компонент, чем пользоваться этими огрызками. С модальными диалогами беда - нельзя из С++ вызвать свой модальный диалог. DeleteOnClose в новых QtQuick* классах отсутствует.

Хотел бы поинтересоваться, как QML (2.*) использовать лучше всего. Может я его просто неправильно готовлю? Есть ли какие-нибудь хорошие примеры кода?

Deleted

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

просто используй QtWidgets.

dib2 ★★★★★
()

Подписался на тему. Но судя по всему, готовить этот QML так и не научились. Демки выглядят клево, но когда доходит до разработки серьезных вещей, просто расчехляется QWidget и всем становиться заехорошо.

trex6 ★★★★★
()

нет базовых элементов для ui, вроде textarea

TextEdit и TextInput разве мало?

Прикол QML в том, что можно легко и просто создавать новые элементы с свистелко/перделками.

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

TextEdit и TextInput разве мало?

Мало, хочется встроенный скроллбар хотя бы. А то слишком много своего кода приходится писать, чтобы всё работало.

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

А вот за это спасибо, не знал, что так можно.

Deleted
()

С модальными диалогами беда - нельзя из С++ вызвать свой модальный диалог.

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

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

Примерно так:

#include <QtDeclarative>
#include <QtGui>

class PushButtonItem : public QDeclarativeItem {
Q_OBJECT
public:
PushButtonItem(QDeclarativeItem *parent =0) : QDeclarativeItem(parent) {
pb = new QPushButton("text");
proxy = new QGraphicsProxyWidget(this);
proxy->setWidget(pb);
proxy->setPos(-pb->sizeHint().width()/2, -pb->sizeHint().height()/2);
}
private:
QPushButton *pb;
QGraphicsProxyWidget *proxy;
};


int main(int argc, char **argv) {
QApplication app(argc, argv);
QDeclarativeView view;
qmlRegisterType<PushButtonItem>("PushButton", 1, 0, "PushButtonItem");
view.setSource(QUrl::fromLocalFile("file.qml"));
view.show();
return app.exec();
};

with file.qml:
import Qt 4.7
import PushButton 1.0


Rectangle {
width: 300
height: 300
PushButtonItem {
anchors.centerIn: parent
}
}

ЗЫ: А еще можно в пол-пинка пробросить в QML инстанс потомка QObject и напрямую обращатьтся к его пропертям, сигналам/слотам и некоторым методам.

выглядит примерно так:

    QDeclarativeView *view = new  QDeclarativeView(main_window);
    view->setResizeMode(QDeclarativeView::SizeRootObjectToView);
    view->rootContext()->setContextProperty("mainwindow", main_window);

И теперь в QML есть доступ к главному окну по имени «mainwindow»

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

Проброс нативных виджетов работает только для QML 1, в QML 2 уже так не получится, т.к. там иерархия наследования QQuick* (бывших QDeclarative) не идёт больше от QWidget и рисуется по-другому как-то. В 5.1 добавили контейнер, но это всё же немного другое

        QQuickView* dv = new QQuickView();
        dv->setSource(QUrl("qrc:/qml/resources/qml/InfoDialog.qml"));
        QWidget *container = QWidget::createWindowContainer(dv, this);

Из оф. док к 5.1:

Defining Visual Items with the Qt Quick Module.

When building user interfaces with the Qt Quick module, all QML objects that are to be visually rendered must derive from the Item type, as it is the base type for all visual objects in Qt Quick. This Item type is implemented by the QQuickItem C++ class, which is provided by the Qt Quick module. Therefore, this class should be subclassed when it is necessary to implement a visual type in C++ that can be integrated into a QML-based user interface.

See the QQuickItem documentation for more information. Additionally, the Writing QML Extensions with C++ tutorial demonstrates how a QQuickItem-based visual item can be implemented in C++ and integrated into a Qt Quick-based user interface.

А контекстный объект в QML это всё же не то.

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

В 5.1 добавили контейнер для QQuickView, но это всё же немного другое, хотелось бы наоборот :)

QQuickView* dv = new QQuickView();
        dv->setSource(QUrl("qrc:/qml/resources/qml/InfoDialog.qml"));
        QWidget *container = QWidget::createWindowContainer(dv, this);

Deleted
()

Все очень просто бро: не надо использовать стандартные виджеты. С QML нужно работать как с HTML - рисуешь эскизы, верстаешь, пробрасываешь сигналы и вуаля. Лично мне все это нахрен не нужно, т.к. программ с YOBA интерфейсом я не пишу, ну а ты сам решай.

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