我必须在基于Qml的应用程序中重用Widget应用程序和最新的Qt版本(Qt 5.2)。但是对于大多数人来说,这样做是非常糟糕的。
有人可以解释,为什么这是个坏主意?
部分代码段
*的.h
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);
};
*。CPP
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");
}
* .qml文件
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")
}
}
}
}
答案 0 :(得分:1)
因为您不想在不需要时添加对3d渲染的依赖性。 3d渲染可能导致massive trouble数量proper file dialogs,您可以在没有Qt Quick的Qt Widgets应用程序中避免这种情况。
如果您打算开发Qt Quick应用程序,很可能在某些时候您需要来自Qt Widgets的东西。这适用于例如当您需要tray icons,here或只想获得Qt Widgets QApplication
中的原生系统颜色而不是Qt Quick {{1}时的颜色时}}。因此,根据我自己的经验,我反对Micht指出对Qt Widgets的不必要的依赖。
因此,对于使用现有QWidgets的新Qt Quick应用程序,我认为这是一个很好的中间步骤。
答案 1 :(得分:0)
这很有意思,我不知道你能做到这一点!
以下是我能想到的一些原因:
QWidget::render()
实例的不必要的内存开销(这包括小部件可能进行的任何信号/插槽连接)。QQuickPaintedItem::paint()
代码路径。我没有考虑过这是多么复杂,但这是需要考虑的事情。这些都假设您不需要其他东西的小部件依赖。如果你出于某种原因确实在同一个应用程序的其他地方需要它,它听起来并不那么疯狂(感觉奇怪的是写这个......)。实际上,我非常有兴趣听到为什么这是一个坏主意。
所以,问题是,为什么你不能将绘画命令从小部件中移出并直接进入{{1}}实现?您是否需要在Qt Quick应用程序中使用小部件来处理其他事情?如果是这样,是什么?