我已经为要从结构访问的成员定义了宏。我不想将强制类型转换为任何其他数据类型。
示例:
#define LABLE ui->lable->setText("NumbVal")
#define LABLE1 ui->lEditCaliCLFltBst->setText("UNDER PROCESS")
if (EditMode[LOC_04]!=0) { LABLE; } else { LABLE1; }
我想从结构中访问此LABLE变量。但是如果我有大量的EditMode数组被委托怎么办 - 我不能让我的程序变得简单,我只想通过它们访问它们。
答案 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
的用途。
以下示例演示了以下内容:
使用状态机来控制每个州的用户界面的外观。
用户界面有两个并行状态: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();
}