Qt 为什么将小部件嵌入基于Qml的应用程序是个坏主意
我必须使用最新的Qt版本(Qt5.2)在基于Qml的应用程序中重用小部件应用程序。但大多数人认为这样做是非常糟糕的 有人能解释一下为什么这是个坏主意吗 一些代码片段 *h *.cppQt 为什么将小部件嵌入基于Qml的应用程序是个坏主意,qt,qml,qwidget,qt5.2,Qt,Qml,Qwidget,Qt5.2,我必须使用最新的Qt版本(Qt5.2)在基于Qml的应用程序中重用小部件应用程序。但大多数人认为这样做是非常糟糕的 有人能解释一下为什么这是个坏主意吗 一些代码片段 *h *.cpp 真有趣,我不知道你能做到 以下是我能想到的一些原因: 存储和构造每个QWidget实例所需的不必要内存开销(包括widget可能进行的任何信号/插槽连接) 不必要地运行QWidget::render()代码路径。我还没有研究这是多么复杂,但这是一个值得考虑的问题。 对Qt小部件不必要的依赖 失去交互(鼠标、键盘、触
真有趣,我不知道你能做到 以下是我能想到的一些原因:
QWidget
实例所需的不必要内存开销(包括widget可能进行的任何信号/插槽连接)QWidget::render()
代码路径。我还没有研究这是多么复杂,但这是一个值得考虑的问题。所以,问题是,为什么不能将绘制命令移出小部件,直接放入
QQuickPaintedItem::paint()
实现中?您是否需要Qt Quick应用程序中的小部件来实现其他功能?如果是,什么?因为您不想在不需要的情况下添加对3d渲染的依赖。3d渲染可能会导致大量的错误,这在没有Qt Quick的Qt Widgets应用程序中是可以避免的
如果您计划开发一个QtQuick应用程序,那么在某个时候您可能需要来自QtWidget的东西。例如,当您需要或只想获得Qt WidgetsQApplication
中的本机系统颜色,但Qt Quick的QGuiApplication
中没有本机系统颜色时,这一点适用。因此,根据我自己的经验,我反对Micht对Qt小部件的不必要依赖
因此,对于使用现有QWidgets的新Qt Quick应用程序,我认为这是一个很好的中间步骤。您打算怎么做?我使用了新Qt版本中的QQuickPaintedItem和QQmlExtensionPlugin类。所以。。。那就没有小部件了?我错过了什么p这听起来是一个非常明智的方法,假设您只是从您的小部件类复制了
QPainter
命令,而没有与小部件相关的内容。关于系统颜色的观点很好。我无法想象其他东西对于嵌入式或移动设备经常是必要的。
class MyAppItem: public QQuickPaintedItem{
Q_OBJECT
public:
explicit MyAppItem(QQuickItem *parent = 0);
void paint(QPainter *painter);
private:
CMyAppWidget *bp;
};
class RouteBWExtensionPlugin: public QQmlExtensionPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
public:
/**
* @brief register the plugin
* @param[in] uri to be registered
*/
void registerTypes(const char * uri);
};
MyAppItem::MyAppItem(QQuickItem *parent)
: QQuickPaintedItem(parent)
{
bp = new CMyAppWidget();
}
void MyAppItem::paint(QPainter *painter)
{
bp->render(painter);
}
void RouteBWExtensionPlugin::registerTypes(const char * uri)
{
qmlRegisterType<MyAppItem>(uri, 1, 0, "MyAppItem");
}
import MyAppWidget 1.0
Item {
width: 300
height: 10
anchors.right: parent
MyAppItem {
width: 94
height: 240
anchors.right: parent
MouseArea{
anchors.fill: parent
onClicked: {
console.log("[veo] onClicked - capture triggered")
}
}
}
}