使用许多小部件设置UI对象

时间:2016-04-04 04:19:06

标签: c++ qt

我正在使用Qt 5.5.1。我有一个MainWindow,它是用代码手动创建的。它有一个QListWidgetQStackedWidget。另外,我有5个小部件,其中*.ui个文件是在表单设计中制作的。问题是我不知道如何为来自MainWindow.cpp的表单上的对象设置字段。

以下是pages.h的第一行:

#include <QWidget>

namespace Ui
{
    class settings;
    class textCreating;
    class databasework;
    class AutoMode;
    class ManualMode;
}

class settings : public QWidget
{
    Q_OBJECT
public:
    settings(QWidget *parent = 0);
    ~settings();
    static Ui::settings *ui; //It was private and not static at first
private:
};

//other classes//
//...//

在pages.cpp中:

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

和MainWindow.cpp:

MainWindow::MainWindow()
{
    //code here//

    settings::ui->firstAddedParamLabel->setVisible(true);
}

所以,当我编译时,我得到:

  

错误:'Ui :: settings * settings :: ui'是一个静态数据成员;它可以   只能在其定义中初始化        settings :: settings(QWidget * parent):QWidget(parent),ui(new Ui :: settings)

它指向ui(new Ui::settings)。我的问题是,如何设置/获取UI字段?我无法完全理解。谢谢!

2 个答案:

答案 0 :(得分:2)

你的“ui”成员不应该是静态的。你为什么决定这样做?您甚至可以将它用作简单的类作用域成员,例如:

#include <QWidget>    
#include "ui_settings.h"

class settings : public QWidget
{
  Q_OBJECT

public:
  settings(QWidget* parent) : QWidget(parent)
  {// move this to cpp...
    ui.setupUi(this);
  }
  virtual ~settings();

public:
  Ui::settings ui;
};

要使用它,您可以简单地将其添加为MainWindow类的成员。

class MainWindow : public QMainWindow
{
  Q_OBJECT

public:
  MainWindow(QWidget* parent)
  {
    _settings = new settings(this);
    setCentralWidget(_settings); // You may also add it somewhere else in your layout, of course.

    _settings->ui.firstAddedParamLabel->setVisible(true);
  }

private:
  settings* _settings;
};

就我个人而言,我认为将整个Ui::settings课程公开为公开并不是很美。我还建议保持一个干净的代码风格,并使用正确的驼峰式类型和更健壮的类名。

例如:settings =&gt; SettingsWidget 对于生成的UI类,可能是:ui::settings =&gt; Ui::SettingsWidgetForm

这样可以更容易地保持生成和自写类之间的区别。

答案 1 :(得分:0)

如果你真的想让它静止,你可以尝试下面:

在你的page.cpp中:

Ui::settings *settings::ui = 0;
settings::settings(QWidget *parent) : QWidget(parent), ui(new Ui::settings)
{
    ui->setupUi(this);
}

或者,如果上述代码不起作用,请尝试以下操作:

Ui::settings *settings::ui = new Ui::settings;
settings::settings(QWidget *parent) : QWidget(parent)
{
    ui->setupUi(this);
}

我的问题仍然是你为什么要让它静止?你想要实现什么?如果你想操纵UI,你应该在你的设置小部件中进行操作,这不是一个好习惯。如果你在UI上发现了什么问题,很难找到,因为一切都能够操纵它。