使用一個狀態機來控制在每個狀態的用戶界面的外觀。
用戶界面有兩個並行狀態: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();
}
你可以顯示你的意思是通過從結構訪問什麼東西更好的例子嗎? –
你的宏是一個函數調用,而不是一個變量。 – UmNyobe
實際上,'LABLE;'應該可以工作,因爲'ui'在當前範圍的結構中定義並且具有'lable'屬性,該屬性也具有'setText'方法。 –