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

标签 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 数组怎么办 - 我不能让我的程序变得冗长我只想通过结构访问它们。

最佳答案

您所展示的至少应该是函数。

例如:

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. 一种相当简洁的方法,可以为就地创建的常量列表的元素重复一些代码。这是 C++11 之前的代码。

回到您的原始代码,也许 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();
}

关于c++ - 我们如何从结构中访问#define变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24948909/

相关文章:

c++ - 来自 MSDN 的 InternetGetConnectedState 和 "it should not be used from a service"语句

c++ - COM 对象的 SAFEARRAY

c++ - 将自定义样式表应用于 QTextDocument

c++ - 在QT中绘制具有特定角度的多段线

c++ - 我在 VS12 中编写代码,但它无法在 Linux 上编译

c++ - 无法打印字符串数组元素

php - 启用 SSL 认证 (HTTPS) 后 HTTP 附加 GET 输入两次

python - 我的 QFileSystemModel 在 PyQt 中无法按预期工作

c++ - 是否可以在 QTreeWidgetItem 上禁用浅蓝色鼠标突出显示?

windows - qmake命令将文件和文件夹复制到输出目录