2014-07-25 62 views
0

我已經爲要從結構訪問的成員定義了宏。我不想輸入任何其他數據類型。我們如何從結構中訪問#define變量

實施例:

#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

你的宏是一個函數調用,而不是一個變量。 – UmNyobe

+0

實際上,'LABLE;'應該可以工作,因爲'ui'在當前範圍的結構中定義並且具有'lable'屬性,該屬性也具有'setText'方法。 –

回答

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成員,沒有明確的堆存儲。請注意整個代碼中沒有單個顯式的newdelete。這本身不應該是目的,但它肯定有助於避免非託管指針的一些陷阱,並且它減少了每個對象的堆分配數量。當您將所有成員放入pimpl class時,這些模式也很有用。

  • 一個合理簡潔的重複某些常量列表元素代碼的方法,創建就地。這是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(); 
    }