我们如何从结构中访问#define变量

时间:2014-07-25 05:53:15

标签: c++ qt

我已经为要从结构访问的成员定义了宏。我不想将强制类型转换为任何其他数据类型。

示例:

#define LABLE ui->lable->setText("NumbVal")
#define LABLE1 ui->lEditCaliCLFltBst->setText("UNDER PROCESS") 
if (EditMode[LOC_04]!=0) { LABLE; } else { LABLE1; } 

我想从结构中访问此LABLE变量。但是如果我有大量的EditMode数组被委托怎么办 - 我不能让我的程序变得简单,我只想通过它们访问它们。

1 个答案:

答案 0 :(得分:2)

你所展示的内容至少应该是功能。

例如:

class Foo : public QWidget {
  QScopedPointer<Ui::Foo> ui; // Don't use a raw pointer!
  enum { LOC_04, LOC_END };
  int m_editMode[LOC_END];

  void lable1() { ui->lable->setText("NumbVal"); }
  void lable2() { ui->lEditCaliCLFltBst->setText("UNDER PROCESS"); }
  ...
  void f() {
    ...
    if (EditMode[LOC_04]!=0) lable1(); else lable2();
    ...
  }
}

使用您显示的小代码,我推断您有一个可以处于各种状态的接口,并且这些状态通过多个用户界面元素指示。这是QStateMachine的用途。

以下示例演示了以下内容:

  1. 使用状态机来控制每个州的用户界面的外观。

    用户界面有两个并行状态:m_editState和m_boldState。状态是并行的,这意味着状态机同时位于这些状态的两个中。想象一下,这是在某种文本编辑器中。

    编辑状态可以位于两个子状态之一:m_edit1和m_edit2。类似地,粗体状态可以是两种状态:m_boldOn和m_boldOff。

    单击按钮可切换状态,并修改标签上的指示。

  2. 在不使用UI设计器的情况下简洁地设置用户界面。

  3. 直接在QObject中使用QObject成员,没有显式堆存储。请注意,整个代码中缺少单个显式newdelete。这不应该是它本身的结束,但它肯定有助于避免非托管指针的一些陷阱,并且它将每个对象的堆分配数量减半。当您将所有成员放入pimpl class

  4. 时,此图案也很有用
  5. 一种相当简洁的方法,可以为常量列表的元素重复一些代码。这是前C ++ 11代码。

  6. 回到原始代码,也许EditMode可以用一组状态来表示。如果EditMode有多个方面,它们将由并行状态表示 - 也许EditMode中的每个条目都是并行状态。如果不了解你打算要实现的目标,那么很难说清楚。

    screenshot

    #include <QApplication>
    #include <QLabel>
    #include <QPushButton>
    #include <QStateMachine>
    #include <QGridLayout>
    
    class Widget : public QWidget {
        QGridLayout m_layout;
        QLabel m_label1, m_label2, m_label3;
        QPushButton m_button1, m_button2, m_button3;
        QStateMachine m_machine;
        QState m_editState, m_boldState, m_edit1, m_edit2, m_boldOn, m_boldOff;
    public:
        Widget(QWidget * parent = 0) : QWidget(parent), m_layout(this),
            m_label1("--"), m_label2("--"), m_label3("--"),
            m_button1("Edit State 1"), m_button2("Edit State 2"), m_button3("Toggle Bold State"),
            m_editState(&m_machine), m_boldState(&m_machine),
            m_edit1(&m_editState), m_edit2(&m_editState),
            m_boldOn(&m_boldState), m_boldOff(&m_boldState)
        {
            m_layout.addWidget(&m_label1, 0, 0);
            m_layout.addWidget(&m_label2, 0, 1);
            m_layout.addWidget(&m_label3, 0, 2);
            m_layout.addWidget(&m_button1, 1, 0);
            m_layout.addWidget(&m_button2, 1, 1);
            m_layout.addWidget(&m_button3, 1, 2);
    
            m_edit1.assignProperty(&m_label1, "text", "Edit State 1");
            m_edit2.assignProperty(&m_label2, "text", "Edit State 2");
            m_boldOn.assignProperty(&m_label3, "text", "Bold On");
            m_boldOff.assignProperty(&m_label3, "text", "Bold Off");
    
            m_editState.setInitialState(&m_edit1);
            m_boldState.setInitialState(&m_boldOff);
    
            foreach (QState * s, QList<QState*>() << &m_edit1 << &m_edit2) {
                s->addTransition(&m_button1, SIGNAL(clicked()), &m_edit1);
                s->addTransition(&m_button2, SIGNAL(clicked()), &m_edit2);
            }
            m_boldOn.addTransition(&m_button3, SIGNAL(clicked()), &m_boldOff);
            m_boldOff.addTransition(&m_button3, SIGNAL(clicked()), &m_boldOn);
    
            m_machine.setGlobalRestorePolicy(QState::RestoreProperties);
            m_machine.setChildMode(QState::ParallelStates);
            m_machine.start();
        }
    
    };
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
        return a.exec();
    }