2013-04-29 67 views
2

我有一個QDialogBu​​ttonBox與所有標準按鈕和非標準按鈕(添加QPushbutton創建非標準按鈕)。Qt:如何實現QDialogBu​​ttonBox與QSignalMapper的非標準按鈕?

我可以非常規地爲非標準按鈕實現SignalMapper。但在這種情況下,我必須添加2個插槽(用於非標準按鈕的QDialogBu​​ttonBox標準按鈕槽&)。

我需要實現帶有標準按鈕和非標準按鈕的通用插槽的QSignalMapper。

任何人都可以指導我嗎?

回答

7

你不應該需要使用QSignalMapperQDialogButtonBox

QSignalMapper用於將多個信號連接到一個插槽,並且QDialogButtonBox已經爲所有按鈕發出單個信號:clicked(QAbstractButton*)

你可以簡單地用一個圖(QMapstd::map)值分配給按鈕或通過動態特性:

enum { MyRole1 = 1, MyRole2 }; // starting at 1 because an unset property would return 0 
... 
userButton−>setProperty("ActionRole", MyRole1); // a cast to int might be needed here 
buttonBox->addButton(userButton, QDialogButtonBox::ActionRole); 

connect(this, SIGNAL(clicked(QAbstractButton*)), SLOT(dialogButtonClicked(QAbstractButton *button))); 

並在插槽中,你會從傳遞的參數獲得值回信號:

void MyClass::dialogButtonClicked(QAbstractButton *button) { 
    StandardButton standardButton = buttonBox−>standardButton(button); 
    switch(standardButton) { 
    // Standard buttons: 
    case QDialogButtonBox::Ok: 
     ... 
     break; 
    case QDialogButtonBox::Abort: 
     ... 
     break; 

    // Non-standard buttons: 
    case QDialogButtonBox::NoButton: 
     int actionRole = button->property("ActionRole").toInt(); 
     switch(actionRole) { 
     case MyRole1: 
      ... 
      break; 
     case MyRole2: 
      ... 
      break; 
     default: 
      // shouldn't happen 
      break; 
     } 

    } 
} 
0

QSignalMapper可以映射一個QObject和一個整數。所以,你可以用它的作用的非standardButton映射,並創建一個插槽,在參數需要一個角色:

例如:

void Widget::initMap() { 
    QPushButton* buttonReset = new QPushButton("Reset"); 
    signalMapper = new QSignalMapper(this); 
    connect(buttonReset, SIGNAL(clicked()), signalMapper, SLOT(map())); 
    signalMapper->setMapping(button, QDialogButtonBox::ResetRole); 
    connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(slot(int))); 
} 

void Widget::slot(int role) { 
    if (role == QDialogButtonBox::ResetRole) { 
     reset(); 
    } else if (QDialogButtonBox::Apply) { 
     apply(); 
    } 
} 
+0

感謝您的回答。你能告訴我如何爲上面的例子聲明「buttonReset」嗎? 通常我添加標準按鈕爲: ui-> buttonBox-> addButton(QDialogBu​​ttonBox :: Reset); 和非標準按鈕爲: userButton = new QPushButton(tr(getButtonText(button))); ui-> buttonBox-> addButton(userButton,QDialogBu​​ttonBox :: ActionRole); – skg 2013-04-29 12:21:13

+0

我認爲buttonReset是一個像QPushButton這樣的非標準按鈕。 (我更新了我的例子)。 – 2013-04-29 12:40:53