【问题标题】:Can't access my UI's widgets无法访问我的 UI 小部件
【发布时间】:2012-10-09 14:03:54
【问题描述】:

我有一个包含所有小部件的 MainWindow 类,我有一个 MyClass 类,我想在其中访问放置在主窗口中的所有小部件(MainWindow 类)。我怎样才能做到这一点?我尝试这样做(下面的代码) - 但它给了我一堆错误:

MyClass.h:4: error: 'Ui' has not been declared
MyClass.h:4: error: expected `)' before '*' token
MyClass.h:6: error: 'Ui' has not been declared
MyClass.h:6: error: ISO C++ forbids declaration of 'MainWindow' with no type
MyClass.h:6: error: expected ';' before '*' token

这个由 QtCreator 创建的 MainWindow - 它是一个由 Qt Creator 创建的标准 GUI 窗口。

// -=-=-=-=-=-=-=-=-=-=[ MyClass.h ]=-=-=-=-=-=-=-=-=-=-=-=-=-
#include "MainWindow.h"
class MyClass {
    public:
        MyClass( Ui::MainWindow *ui );
    private:
        Ui::MainWindow *ui;
};

// -=-=-=-=-=-=-=-=-=-=[ MyClass.cpp ]=-=-=-=-=-=-=-=-=-=-=-=-=-

#include "MyClass.h"

MyClass::MyClass( Ui::MainWindow *ui ){
    this->myUI = ui; // myUI is desclared as: Ui::MainWindow *myUI
}

// -=-=-=-=-=-=-=-=-=-=[ MainWindow.h ]=-=-=-=-=-=-=-=-=-=-=-=-=-
....
namespace Ui {
    class MainWindow;
}
class MainWindow : public QMainWindow {
    Q_OBJECT    
    private:
        Ui::MainWindow *ui; // this has done by Qt Creator
    public:
        MyClass *myClass;
}
// -=-=-=-=-=-=-=-=-=-=[ MainWindow.cpp ]=-=-=-=-=-=-=-=-=-=-=-=-=-
#include "MainWindow.h"
MainWindow::MainWindow( QWidget *parent ): QMainWindow( parent ), ui( new Ui::MainWindow ) {
    ui->setupUi( this );
    myClass = new MyClass( ui ); // my attempt
}

更新: 米色下面的评论中有有用的代码。它工作正常。但不是在我的情况下:(当我尝试从任何类(不是从 MainWindow.h)声明 MyClass 时:

// -=-=-=-=-=-=-=-=-=-=[ MyGLWidget.h ]=-=-=-=-=-=-=-=-=-=- =-=-=-

#include "MyClass.h"
class MyGLWidget : public QGLWidget {
   Q_OBJECT
   public:
     MyClass *myClass;
}

它不起作用:

myclass.h:9: error: 'Ui' has not been declared
myclass.h:9: error: expected `)' before '*' token
myclass.h:12: error: 'Ui' has not been declared
myclass.h:12: error: ISO C++ forbids declaration of 'MainWindow' with no type
myclass.h:12: error: expected ';' before '*' token

但是为什么呢?我在 MyClass.h 中声明了“ui_mainwindow.h”。

【问题讨论】:

  • 那是您拥有的确切代码吗?您是否遇到运行时错误或编译器错误?
  • 就行了:“public: MyClass(Ui::MainWindow ui);”在 MyClass.h 中,我给出了一个错误:“错误:预期的 `)' 在 '' 标记之前”。编译器也在这一行声明:“私有:Ui::MainWindow *ui;”:“错误:ISO C++ 禁止声明没有类型的 'MainWindow'”。
  • 也许有人可以用 MyClass.h 和 MyClass.cpp 发布一些可以访问主窗口 ui 的简单代码?
  • 您必须首先包含“ui_...”,或者前向声明类 Ui::MainWindow。
  • @JavaRunner,“ui_..”文件由用户界面编译器生成(参见qt-project.org/doc/qt-4.8/uic.html)。我已经向您发布了一些可以使用的代码。

标签: c++ qt


【解决方案1】:

MyClass 头文件必须包含用户界面编译器生成的头文件。在您的情况下,它被称为 ui_mainwindow.h。 MyClass 的构造函数将获取 Ui::MainWindow 参数并将其保存在私有成员变量中。

在 MainWindow 的构造函数中,您可以使用 MainWindow ui 初始化 MyClass 成员变量。

// -=-=-=-=-=-=-=-=-=-=[ myclass.h ]=-=-=-=-=-=-=-=-=-=- =-=-=-

#include <ui_mainwindow.h>

class MyClass
{
public:
    MyClass(Ui::MainWindow *ui);

private:
    Ui::MainWindow *myUi;
};

// -=-=-=-=-=-=-=-=-=-=[ myclass.cpp ]=-=-=-=-=-=-=-=-=-=- =-=-=-

MyClass::MyClass(Ui::MainWindow *ui)
{
    // Save the MainWindow-ui as private member of MyClass
    this->myUi = ui;
}

// -=-=-=-=-=-=-=-=-=-=[ MainWindow.h ]=-=-=-=-=-=-=-=-=-=- =-=-=-

#include <QMainWindow>
#include "myclass.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    MyClass *myClass; // myClass member dont't has to be public
};

// -=-=-=-=-=-=-=-=-=-=[ MainWindow.cpp ]=-=-=-=-=-=-=-=-=-=- =-=-=-

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // Initialize MyClass with the MainWindow-ui
    myClass = new MyClass(ui);
}

MainWindow::~MainWindow()
{
    delete myClass;
    delete ui;
}

【讨论】:

  • 那是很棒的代码...您可能还想添加一个解释。 ;)
  • 是的,我想要。我添加了一些cmets。还将 MainWindow 的 myClass 成员设为私有并在析构函数中将其删除。我想,这样就可以了:)。
  • 更好,但可以在顶部添加一两句话来说明您的代码实际演示的解决方案。这也可能会阻止它出现在我们的审查工具中,因为它是纯代码的。
  • @Bart:感谢您提供的信息。请问一下审核工具是什么?
  • 感谢您的帮助!此代码有效!但是当我尝试从另一个类声明 MyClass 时它不起作用:(我已经更新了我的第一篇文章
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 2015-07-11
  • 2019-07-01
  • 2022-12-18
相关资源
最近更新 更多