【问题标题】:QT/C++ yet another issue about accessing UI filesQT/C++ 另一个关于访问 UI 文件的问题
【发布时间】:2012-02-10 17:44:39
【问题描述】:

虽然我已经阅读了这个问题的答案

QT/C++ - Accessing MainWindow UI from a different class 并搜索了整个 www 很长一段时间 - 我没有得到它的工作。

我的任务是使用 QT Designer 重新创建应用程序 UI。不幸的是,已经有一些 UI 分布在多个类中(团队随后想到了使用 QT 但不使用 Designer 但“手工编码”UI 似乎没有什么意义的想法)

所以现在我的工作是解开开放的末端,创建一个 GUI(完成此任务)找到所有可能的信号和插槽,然后将它们放在一起,看起来又漂亮又干净。

理论部分就讲这么多。

补充:我在 C++ 方面的经验很少,而且我似乎无处可寻,直到明天才有时间阅读整本书,否则我不会问。

我对两件事有点抓狂:

A) 我的 mainwindow.cpp、mainwindow.h 和 mainwindow.ui 需要链接到其他文件,例如previewwidget.cpp... previewwidget.cpp 有很多类似的代码:

 buttonLayout->addWidget(fpsSpinBox, 0, Qt::AlignCenter);
 buttonLayout->addWidget(playButton, 0, Qt::AlignCenter);
 buttonLayout->addWidget(backwardButton, 0, Qt::AlignCenter);

显然我通过在 Designer 中创建相应的按钮来替换它。 现在在同一个文件中有连接信号槽条目(我添加了“ui->”)

 connect(ui->playButton, SIGNAL(clicked()), this, SIGNAL(playButtonClicked()));
 connect(ui->stopButton, SIGNAL(clicked()), this, SIGNAL(stopButtonClicked()));
 connect(ui->forwardButton, SIGNAL(clicked()), this, SIGNAL(forwardButtonClicked()));

但编译器一直告诉我:

\preview\previewwidget.cpp:77: 错误:'ui' 未在此范围内声明

我将 ui_mainwindow.h 放入标题中,但这也不是解决方案。


B) 这个问题可能与第一个问题密切相关:由于设计师严格将模型/视图/控件分开,我需要重写信号和插槽以匹配新 UI - 有任何人都得到了一个很好的教程或任何提示我如何快速和简单地做到这一点?

任何帮助将不胜感激。

【问题讨论】:

    标签: c++ qt user-interface header-files signals-slots


    【解决方案1】:

    假设您有一个名为MyWidget 的类和一个对应的ui 文件MyWidget.ui。为了在你的课堂上使用它,我会做以下事情:

    • MyWidget.ui 中为objectName 设置一个值。如果您使用设计器打开文件,它是属性编辑器中的第一个属性。我会把它命名为MyWidget

    • MyWidget.h 中,您必须执行以下操作:

      • 为 ui 对象声明一个命名空间并转发声明它。
      • 添加一个指向 ui 对象的指针作为成员变量(私有)。

    示例头文件如下:

    #ifndef MY_WIDGET_H_
    #define MY_WIDGET_H_
    
    #include <QWidget>
    
    namespace Ui {
        class MyWidget;
    }
    
    class MyWidget : public QWidget {
       Q_OBJECT
    public:
       MyWidget(QWidget* parent = NULL);
       ~MyWidget();
    
       // Add other class functions
    private:
       Ui::MyWidget ui;
    }   
    
    #endif // MY_WIDGET_H_
    
    • MyWidget.cpp
      • 包括自动生成的ui_MyWidget.h
      • 在构造函数中新建一个ui对象
      • 在构造函数中调用 setupUi 函数
      • 在析构函数中删除ui

    示例代码:

    #include "MyWidget.h"
    #include "ui_MyWidget.h"
    
    MyWidget::MyWidget(QWidget *parent)
    :QWidget(parent), ui(new Ui::MyWidget)
    {
        ui->setupUi(this);
    }
    
    MyWidget::~MyWidget()
    {
        delete ui;
    }
    

    现在您已准备好在整个课堂中使用该 ui。例如,如果您有一个名为spinBox1 的旋转框,您可以使用

    int val = ui->spinBox1->value();
    

    .ui 信号和槽

    我建议您使用QtDesigner 来建立ui 小部件和插槽之间的连接。查看this link 了解更多详情。

    如果您想将小部件与自定义插槽连接,您可以再次这样做using the designer

    1. 切换到编辑信号/槽模式 (F4)
    2. 从要发出信号的小部件拖放到要接收信号的小部件。
    3. 将出现一个配置连接对话框,其中显示了发射小部件的信号和接收小部件的插槽。点击 编辑...在右侧插槽列下方。
    4. 将出现一个 Signals/Slots of ReceivingWidget 对话框。在这里,可以单击插槽下方的加号图标以添加新的插槽 任何名字。
    5. 然后您可以返回并在“配置连接”对话框中连接到您的新插槽,或者实际上在“信号/插槽编辑器”中 停靠小部件回到主窗口。

    【讨论】:

    • 不幸的是,设计师的信号和插槽没有帮助。事实上:还有很多其他的东西在发生,这在设计器 UI 中是不可见的——例如:所有 Button 调用都在 previewWidget.cpp 中实现
    • 您必须将连接从 cpp 文件移动到 ui。使用设计器在按钮调用与 cpp 中定义的插槽之间创建连接。对于自定义信号,您必须在 cpp 中建立连接。
    猜你喜欢
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多