Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/72: Рейтинг темы: голосов - 72, средняя оценка - 4.96
obiz

Всестороннее сравнение WPF против Qt+QML

31.08.2012, 01:50. Показов 15295. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.

Сабж.
Очень прошу поучаствовать всех кто разбирается в обоих технологиях. Хочется собрать полный список весомых отличий в теории и практике
применения как Qt+QML так и WPF для создания обьёмных десктопных приложений. Плюсы и минусы того идругого
Первое что самому приходит в голову:
WPF
+++
Проще найти разработчиков
Большое количество готовых контролов
Кастомные контролы есть в опенсорсе и в продаже
Дружественный к Win системам
---
Требует фрейморк
Win-only
MS может в любой момент забросить как и сильверлайт и многое другое

QML
+++
Декларативное описание интерфеса (полезно для скинов)
мультиплатформа
---
Изначально задуман не для десктопа отсюда недостаток элементов управления
сама QT ходит по рукам и не известно будет ли развиваться и поддерживаться

Приглашаю к обсуждению!
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.08.2012, 01:50
Ответы с готовыми решениями:

Подсветка QML элементов QML-ного плагина в QtCreator в случае нахождения QML файлов плагина в ресурсах!
Здравствуйте! Если сделать плагин для QML и подключить его в основном проекте ну как - то так: import MiracleStudio.SkyControls 1.0 ...

QMl/QT при нажатии на кнопку должен окрыться другой qml файл
Додал anchors Вот что я сделал: import QtQuick 2.5 import QtQuick.Controls 1.4 ApplicationWindow { id: applicationWindow...

Как подключить QML-файл в C++ по моде, а также получить ссылки на QML-элементы в C++
Читал в интернете, как подключать QML-файлы. Кто-то использует QQmlView, кто-то QQmlApplicationEngine, а ещё приводят связку QQmlEngine и...

42
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
09.06.2013, 18:58
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от dondublon Посмотреть сообщение
Объект не должен реагировать. Объект должен посылать сигнал, а реагировать - кто-то вне его, тот, кто подписался. Это если по-хорошему.
Беда в том, что сигнал пришёл объекту. Случилось событие, которое касается лично его: по нему клацнули мышкой. Если он считает нужным уведомить об этом весь остальной мир, то пусть шлёт свой сигнал. А те, то на него подписались, пусть уже реагируют на событие "кто-то клацнул мышкой по такому-то объекту".

Цитата Сообщение от dondublon Посмотреть сообщение
Я не вижу, где вы у меня увидели желание сломать ООП.
Вот здесь:
Цитата Сообщение от dondublon Посмотреть сообщение
Мне же не нужно внутри объекта реагировать на событие, мне нужно вне.
Событие приходит объекту лично, а вы хотите реагировать на это событие не внутри объекта, которому оно предназначается, а где-то в левом месте. Вот это место и есть тот самый посредник отсюда:
Цитата Сообщение от dondublon Посмотреть сообщение
Никакого посредника я вставить не хочу. Я хочу подписаться на событие mousePressEvent так же легко, как могу, например, на sceneRectChanged.
Объект не хочет делиться со всем миром сообщением, но вы хотите выставить все кишки наружу. Закономерно получается, что способ не самый красивый. А считать ли невыставление всех кишок наружу плохим архитектурным решением, принятым ребятами из Qt, и обижаться на них — это уже такой вопрос.

Цитата Сообщение от dondublon Посмотреть сообщение
Зачем, когда, в теории можно было бы обойтись без этого?
Затем, что инкапсуляция.
0
Эксперт Python
 Аватар для dondublon
4661 / 2080 / 367
Регистрация: 17.03.2012
Сообщений: 10,202
Записей в блоге: 6
10.06.2013, 07:16
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Беда в том, что сигнал пришёл объекту. Случилось событие, которое касается лично его: по нему клацнули мышкой. Если он считает нужным уведомить об этом весь остальной мир, то пусть шлёт свой сигнал. А те, то на него подписались, пусть уже реагируют на событие "кто-то клацнул мышкой по такому-то объекту".
Совершенно согласен. Вроде, я об этом и говорил.

Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Событие приходит объекту лично, а вы хотите реагировать на это событие не внутри объекта, которому оно предназначается, а где-то в левом месте.
Именно так, да. Но на то оно и событие, таково его предназначение.
Внутри объекта реагировать, как правило, не нужно.

Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Объект не хочет делиться со всем миром сообщением, но вы хотите выставить все кишки наружу.
Я хочу выставить не все, а те, для которых существует gui-шный объект. gui-объекты воспринимают события мышки и клавиатуры - они для этого и сделаны (ну, в частности для этого, понятно, что еще и для отображения чего-либо).
События мышки и клавиатуры должны торчать наружу, да.

Инкапсуляция тут не при чём. Инкапсуляция - это скрытие того, о чём клиент знать не должен. При чем скрывать надо ваще и капитально, так принято. В Qt же вынос событий в методы заместо сигналов плохо скрывает события - он реакцию на события НЕУДОБНОЙ, а не НЕВОЗМОЖНОЙ.
Если уж говорить о вставке посредника, то, скорее, это можно сказать именно о Qt - в роли посредника выступает класс-наследник.

Добавлено через 11 часов 55 минут
Вдогонку.

OhMyGodSoLong, вернёмся к вашему примеру - кнопка с дыркой.
Видимо, вы настолько привыкли наследовать, что уже машинально в качестве примера привели ситуацию, когда это бесспорно оправдано. Между тем, наследование - очень "тяжелое" средство, и, если оно требуется, это значит, нам не хватает "легких" средств - того, что торчит наружу.
Дырка на контроле - это очень специфичное поведение. Настолько, что ради него не грех и наследование применить. А вот реакция на мышку - совсем наоборот, поведение более чем обычное (для gui-шного контрола, разумеется). И ради этого обычного действия вынуждать использовать "тяжелую артиллерию" - наследование - хмхм...

Ну и область видимости, конечно, тоже имеет значение. Вряд ли нам потребуется обработка клика внутри самого контрола. Его задача - принять клик и передать кому следует. По области видимости обработка всё-таки должна быть вовне.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
10.06.2013, 09:04
Вы так говорите, как будто там игру пишете, не вкладываетесь в ФПС из-за наследования и точно знаете благодаря профайлеру, что это именно наследование виновато.

Есть просто разница: вызовами protected-методов ***Event() передаются низкоуровневые события. Которые "мышка залезла на контрол", "какая-то кнопка мышки нажата", "какая-то кнопка мышки отпущена". Последовательности этих событий собираются контролом в высокоуровневые события вроде "на меня нажали".

Первые логично засунуть внутрь самого контрола. Вторые выставить сигналами наружу.
0
Эксперт Python
 Аватар для dondublon
4661 / 2080 / 367
Регистрация: 17.03.2012
Сообщений: 10,202
Записей в блоге: 6
10.06.2013, 14:19
Да не, под "тяжелым" средством я имел в виду не быстродействие, а объем кода, который приходится воспринимать и запоминать.
0
Эксперт Python
 Аватар для dondublon
4661 / 2080 / 367
Регистрация: 17.03.2012
Сообщений: 10,202
Записей в блоге: 6
23.10.2013, 09:45
Вдогонку. Я просто оставлю это здесь.
Задача - сделать текстовое поле с кнопкой.
Как это делается в Qt:
(Отсюда http://stackoverflow.com/quest... tton-pyqt4)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class ButtonLineEdit(QtGui.QLineEdit):
    buttonClicked = QtCore.pyqtSignal(bool)
 
    def __init__(self, icon_file, parent=None):
        super(ButtonLineEdit, self).__init__(parent)
 
        self.button = QtGui.QToolButton(self)
        self.button.setIcon(QtGui.QIcon(icon_file))
        self.button.setStyleSheet('border: 0px; padding: 0px;')
        self.button.setCursor(QtCore.Qt.ArrowCursor)
        self.button.clicked.connect(self.buttonClicked.emit)
 
        frameWidth = self.style().pixelMetric(QtGui.QStyle.PM_DefaultFrameWidth)
        buttonSize = self.button.sizeHint()
 
        self.setStyleSheet('QLineEdit {padding-right: %dpx; }' % (buttonSize.width() + frameWidth + 1))
        self.setMinimumSize(max(self.minimumSizeHint().width(), buttonSize.width() + frameWidth*2 + 2),
                            max(self.minimumSizeHint().height(), buttonSize.height() + frameWidth*2 + 2))
 
    def resizeEvent(self, event):
        buttonSize = self.button.sizeHint()
        frameWidth = self.style().pixelMetric(QtGui.QStyle.PM_DefaultFrameWidth)
        self.button.move(self.rect().right() - frameWidth - buttonSize.width(),
                         (self.rect().bottom() - buttonSize.height() + 1)/2)
        super(ButtonLineEdit, self).resizeEvent(event)
Программист мало того, что вынужден писать код, так ещё и использовать наследование.
А теперь - как это делается в WPF:
XML
1
2
3
4
5
 
       <Grid Background="White" Height="32" VerticalAlignment="Top">
            <TextBox> </TextBox>
            <Button HorizontalAlignment="Right" Width="32" Margin="4" Click="Button_Click_1">*</Button>
        </Grid>
Это, разумеется, минимум, можно было бы использовать темплейты и т.д.
При этом в WPF программист сразу видит результат в редакторе.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.10.2013, 17:17
Я просто оставлю это здесь. (QML)
Полноценный текст самодостаточного приложения:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Window 2.0
 
ApplicationWindow {
    title: qsTr("Hello World")
    width: 640
    height: 480
 
    TextArea {
        text: qsTr("Some text")
        }
 
    Button {
        text: qsTr("Hello World")
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
    }
}
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.10.2013, 17:25
Цитата Сообщение от oxotnik Посмотреть сообщение
Я просто оставлю это здесь. (QML)
Полноценный текст самодостаточного приложения:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Window 2.0
 
ApplicationWindow {
    title: qsTr("Hello World")
    width: 640
    height: 480
 
    TextArea {
        text: qsTr("Some text")
        }
 
    Button {
        text: qsTr("Hello World")
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
    }
}
появилось желание запустить. что нужно сделать? пожалуйста, по пп.: делай раз, делай два... для юниксов и виндоузов.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.10.2013, 17:32
Цитата Сообщение от novi4ok Посмотреть сообщение
появилось желание запустить. что нужно сделать? пожалуйста, по пп.: делай раз, делай два... для юниксов и виндоузов.
Я просто сделал это через мастер проектов кретора, он мне создал файлик с приведенным текстом (я чуть-чуть его изменил) и файлик qml проекта.
Как через консоль или по другому собирать и запускать я хз, т.к. В QML не особо силен.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.10.2013, 17:42
Цитата Сообщение от oxotnik Посмотреть сообщение
Я просто сделал это через мастер проектов кретора, он мне создал файлик с приведенным текстом (я чуть-чуть его изменил) и файлик qml проекта.
Как через консоль или по другому собирать и запускать я хз, т.к. В QML не особо силен.
тогда о какой "самодостаточности" можно говорить?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.10.2013, 17:44
Цитата Сообщение от novi4ok Посмотреть сообщение
тогда о какой "самодостаточности" можно говорить?
Это полный код с точкой входа. Такой же как и:
C
1
2
3
4
5
int main ()
{
   printf("Hello world");
   return 0;
}
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.10.2013, 17:49
Цитата Сообщение от oxotnik Посмотреть сообщение
Это полный код с точкой входа. Такой же как и:
C
1
2
3
4
5
int main ()
{
   printf("Hello world");
   return 0;
}
ну да. убери импорты и посмотрим на самодостаточность.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.10.2013, 17:53
Цитата Сообщение от novi4ok Посмотреть сообщение
ну да. убери импорты и посмотрим на самодостаточность.
ну сишный код без инклюдов тоже не соберется ))) может тогда и ОС снести и попробовать на голом железе запускать?
У любого кода есть зависимости, от этого никуда не деться.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.10.2013, 19:24
ну да, мы и не деваемся :)
но давай остановимся. ты в посте 26 привел аргумент в ответ на кусок xaml-кода, показав, что вот, тут все что нужно для приложения с кнопкой. получилось чуть больше, чем этот xaml код, и еще одно отличие: приложение с xaml кодом можно наклацать мышкой, только имя приложения введя (и то, если не устраивает предложенное по умолчанию). а ты свое сомодостаточное полностью ручками слепил (возможно я ошибаюсь, не знаком близко с этой технологией, допускаю, что имеются инструменты). разница имеется.
0
Эксперт Python
 Аватар для dondublon
4661 / 2080 / 367
Регистрация: 17.03.2012
Сообщений: 10,202
Записей в блоге: 6
23.10.2013, 19:50
Цитата Сообщение от oxotnik Посмотреть сообщение
Я просто оставлю это здесь. (QML)
Полноценный текст самодостаточного приложения:
Согласен, эту задачу вы выполнили.
Не проверял, но верю. Завтра проверю, кстати

QML - штука очень бедная по набору тегов. Т.е. аналогичную фишку, но вместо TextArea - менюшку - вы уже не сделаете. Из-за отсутствия менюшки. Потому и делает народ на коленке такие поделки под QML: http://blog.qt.digia.com/blog/... r-desktop/ .
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
24.10.2013, 08:48
Цитата Сообщение от dondublon Посмотреть сообщение
Т.е. аналогичную фишку, но вместо TextArea - менюшку - вы уже не сделаете.
Ну как раз по дефолту то там мастером и создается менюшка File->Close.
Цитата Сообщение от novi4ok Посмотреть сообщение
и еще одно отличие: приложение с xaml кодом можно наклацать мышкой, только имя приложения введя (и то, если не устраивает предложенное по умолчанию). а ты свое сомодостаточное полностью ручками слепил
Я слепил мастером кретора, а по поводу формоклепства -
вот видео построения интерфейса мышкой.

Возможно даже реакции на действия пользователя привязать через редактор QML.
0
Эксперт Python
 Аватар для dondublon
4661 / 2080 / 367
Регистрация: 17.03.2012
Сообщений: 10,202
Записей в блоге: 6
24.10.2013, 08:53
Цитата Сообщение от oxotnik Посмотреть сообщение
Ну как раз по дефолту то там мастером и создается менюшка File->Close.
Не видно. Впрочем, недавно нашал щупать QML, но пока неясно.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
24.10.2013, 08:58
Цитата Сообщение от dondublon Посмотреть сообщение
Не видно. Впрочем, недавно нашал щупать QML, но пока неясно.
пжалуйста, меню, которое нагенерила ИДЕ:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ApplicationWindow {
    title: qsTr("Hello World")
    width: 640
    height: 480
 
    menuBar: MenuBar {
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("Exit")
                onTriggered: Qt.quit();
            }
        }
    }
 
    Button {
        text: qsTr("Hello World")
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
    }
}
0
Эксперт Python
 Аватар для dondublon
4661 / 2080 / 367
Регистрация: 17.03.2012
Сообщений: 10,202
Записей в блоге: 6
24.10.2013, 09:21
Цитата Сообщение от oxotnik Посмотреть сообщение
пжалуйста, меню, которое нагенерила ИДЕ:
Не удаётся запустить. Надо тягать много зависимостей (qml puppet для просмотра, также проблема с путями).
В общем, ладно. Уже круто, что там таки есть эти элементы.
Но, надеюсь, вы ответите на следующий вопрос:
- Эта кнопка внутри меню-итема или нет?

Я у себя в проекте WPF сделал так:
Название: wpf1.png
Просмотров: 249

Размер: 1.7 Кб
Название: wpf2.png
Просмотров: 248

Размер: 2.5 Кб
То есть, в основе - стандартный контрол, внутрь засовываю, что хочу. Позволяет ли такое QML?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
24.10.2013, 09:43
Цитата Сообщение от dondublon Посмотреть сообщение
- Эта кнопка внутри меню-итема или нет?
теоретически можно (вот тут вроде что то типа такого есть http://qt-project.org/doc/qt-4... edqml.html)
практически - не силен в QML.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.10.2013, 10:22
похоже, опять все сводится к тому, что лучше всегда то, что привычнее. чтобы судить объективно, нужно иметь богатый опыт во всем, а на это времени хватить даже теоретически не может, а практически никто не станет осваивать что-то такое же, если его хоть как-то устраивает то, чем он уже владеет и в чем имеет опыт. поэтому тема вполне справедливо находится там, где находится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.10.2013, 10:22

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

QML вызов другого qml
Всем привет. Название темы немного неверное. Вообщем проблема такая. Делаю игру на qml, и есть main_menu.qml, далее мне необходимо вызвать...

WPF async void fun() для событий контролла. (MapCOntrol.WPF)
Задача: Отмечаем чекбокс элементы и рисуем их на карте. При нажатии на кнопку выполняется событие, где вызывается функция, в которой...

WPF команды и MVVM. Часть 1. [WPF, Элд Хасп]
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html Для использования и создания WPF команд в Net предусмотрен...

Открыть WPF внутри другого WPF окна
Добрый день! Имеется задача: В WPF окне (назовем его MainWindow.xaml с привязкой к MainWindow.xaml.cs), имеется элемент Frame...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru