我已经为我想从结构中访问的成员定义了宏。我不想强制转换为任何其他数据类型。
示例:
#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
的用途。
下面的示例演示了以下内容:
使用状态机来控制用户界面在每个状态下的外观。
用户界面有两个并行状态:m_editState 和 m_boldState。状态是并行的,这意味着状态机同时处于两个 状态。想象一下这是在某种文本编辑器中。
编辑状态可以是两个子状态之一:m_edit1 和 m_edit2。同样,粗体状态可以有两种状态:m_boldOn 和 m_boldOff。
点击按钮切换状态,修改标签上的指示。
无需使用 UI 设计器即可简洁地设置用户界面。
直接在 QObject 中使用 QObject 成员,无需显式堆存储。请注意,整个代码中没有一个显式的
new
和delete
。这本身不应该结束,但它确实有助于避免非托管指针的一些陷阱,并且它可以将每个对象的堆分配数量减半。当您将所有成员放在 pimpl class 中时,此模式也很有效.一种相当简洁的方法,可以为就地创建的常量列表的元素重复一些代码。这是 C++11 之前的代码。
回到您的原始代码,也许 EditMode
可以由一组状态表示。如果 EditMode
有多个方面,它们将由并行状态表示 - 也许 EditMode
中的每个条目都是并行状态。在不知道您打算实现什么的情况下,很难说清楚。
#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/