我有一個QDialogButtonBox與所有標準按鈕和非標準按鈕(添加QPushbutton創建非標準按鈕)。Qt:如何實現QDialogButtonBox與QSignalMapper的非標準按鈕?
我可以非常規地爲非標準按鈕實現SignalMapper。但在這種情況下,我必須添加2個插槽(用於非標準按鈕的QDialogButtonBox標準按鈕槽&)。
我需要實現帶有標準按鈕和非標準按鈕的通用插槽的QSignalMapper。
任何人都可以指導我嗎?
我有一個QDialogButtonBox與所有標準按鈕和非標準按鈕(添加QPushbutton創建非標準按鈕)。Qt:如何實現QDialogButtonBox與QSignalMapper的非標準按鈕?
我可以非常規地爲非標準按鈕實現SignalMapper。但在這種情況下,我必須添加2個插槽(用於非標準按鈕的QDialogButtonBox標準按鈕槽&)。
我需要實現帶有標準按鈕和非標準按鈕的通用插槽的QSignalMapper。
任何人都可以指導我嗎?
你不應該需要使用QSignalMapper
與QDialogButtonBox
。
QSignalMapper
用於將多個信號連接到一個插槽,並且QDialogButtonBox
已經爲所有按鈕發出單個信號:clicked(QAbstractButton*)
。
你可以簡單地用一個圖(QMap
,std::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;
}
}
}
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();
}
}
感謝您的回答。你能告訴我如何爲上面的例子聲明「buttonReset」嗎? 通常我添加標準按鈕爲: ui-> buttonBox-> addButton(QDialogButtonBox :: Reset); 和非標準按鈕爲: userButton = new QPushButton(tr(getButtonText(button))); ui-> buttonBox-> addButton(userButton,QDialogButtonBox :: ActionRole); – skg 2013-04-29 12:21:13
我認爲buttonReset是一個像QPushButton這樣的非標準按鈕。 (我更新了我的例子)。 – 2013-04-29 12:40:53