【问题标题】:Bind existing C++ application with Qt interface [closed]将现有的 C++ 应用程序与 Qt 接口绑定 [关闭]
【发布时间】:2014-03-02 05:41:57
【问题描述】:

我已经编写了一个 C++ 应用程序,它的界面是用 wxWidgets 库制作的。我想用 Qt creator 创建一个新界面。

我的问题是:如何将 C++ 代码与新的 Qt 接口绑定?

【问题讨论】:

  • 您需要重写您的 UI 代码或在您的应用程序和选择的目标库之间添加一个额外的抽象层。无论哪种方式,它都不会容易或快速。

标签: c++ qt qt-creator wxwidgets qt-designer


【解决方案1】:

既然你已经有了工作逻辑,我建议使用基于数据绑定的QtQuick。虽然还有一种叫做QtWidgets的技术比较经典,但是逻辑/视图的分离比QtQuick要弱一些。

开始使用带有 C++ 绑定的 QtQuick 的 3 个关键概念是 Q_PROPERTY / Q_INVOKABLE 宏和 qmlRegisterTypes 方法。

  • 将 Q_PROPERTY 应用于应该与 GUI 交互的 getter / setter
  • 将 Q_INVOKABLE 应用于应从 GUI 调用的方法
  • qmlRegisterTypes 使您能够在 GUI 标记文件(.qml 文件)中使用您的 C++ 类型

如下所示:

public class YourLogicClassWrapper : public QObject {
 Q_OBJECT
 Q_PROPERTY(int yourData READ yourData WRITE setYourData NOTIFY yourDataChanged)
  signals:
   yourDataChanged();
  public:
   Q_INVOKABLE void yourMethodInvokedFromGUI(int) { /* ... */ }
   // ... you need to write getter "yourData()" and setter "setYourData(int)"
};

int main(int argc, char** argv) {
{
  qmlRegisterTypes<YourLogicClassWrapper>("YourModule", 1, 0, "YourQmlElem");
  // ... read qml file and display window etc. all generated by QtCreator

完成上述操作后,在 .qml 文件中,您的字段可见且可分配,并且您的方法可调用。

Import QtQuick 2.2
Import YourModule 1.0
Item {
  YourQmlElem {
    id: y
    yourData: 42
  }
  Button {
    onClicked: y.yourMethodInvokedFromGUI(1)
  }
  // ...

【讨论】:

  • 非常感谢@nsuke!好的,与此同时,我可以多学习一些关于 Qt 的知识。关于 Qt quick,你是什么意思 [doc.qt.digia.com/qt-maemo/qml-extending.html](link)?在文档中,他们说 Qt quick 更适用于触摸设备。我的是一个桌面应用程序。我现在将尝试将一小部分现有代码与 Qt quick 和 Qt 小部件绑定。另一个问题,您建议我使用 Qt Creator 还是继续使用已开发应用程序的 Code::Blocks?
  • 我推荐你使用 QtCreator 作为开始。因为你需要让某个Qt工具(即“moc”)在编译之前解释你的头文件。虽然它在 QtCreator 上是自动且几乎透明的,但在其他 IDE 上可能会很棘手,尤其是当您还不知道该工具应该如何工作时。
  • 关于QtQuik,你绝对可以用它来创建桌面应用程序,虽然QtWidgets可能有更经典的感觉。您可能想看看QtQuick control,它是一组相当传统的控件。
  • 太棒了!你帮了我很多!我会这样做的!
猜你喜欢
  • 1970-01-01
  • 2013-06-02
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多