我有一个QDialogButtonBox,其中包含所有标准按钮和非标准按钮(通过添加QPushbutton来创建非标准按钮)。
我可以为非标准按钮单独实现SignalMapper。但在这种情况下,我需要添加2个槽(一个用于QDialogButtonBox的标准按钮,另一个用于非标准按钮)。
我需要使用通用槽实现QSignalMapper,用于处理标准按钮和非标准按钮。
有谁能指导我吗?
我有一个QDialogButtonBox,其中包含所有标准按钮和非标准按钮(通过添加QPushbutton来创建非标准按钮)。
我可以为非标准按钮单独实现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和整数进行映射。因此,您可以将非标准按钮与其角色进行映射,并创建一个带有角色参数的槽:
例如:
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();
}
}