Qt:如何使用QSignalMapper实现QDialogButtonBox以处理非标准按钮?

3

我有一个QDialogButtonBox,其中包含所有标准按钮和非标准按钮(通过添加QPushbutton来创建非标准按钮)。

我可以为非标准按钮单独实现SignalMapper。但在这种情况下,我需要添加2个槽(一个用于QDialogButtonBox的标准按钮,另一个用于非标准按钮)。

我需要使用通用槽实现QSignalMapper,用于处理标准按钮和非标准按钮。

有谁能指导我吗?

2个回答

8
您不需要使用 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和整数进行映射。因此,您可以将非标准按钮与其角色进行映射,并创建一个带有角色参数的槽:

例如:

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
我认为buttonReset就像QPushButton一样是一个非标准的按钮(我已经更新了我的示例)。 - Dimitry Ernot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接