проблема с новой нотацией SIGNAL SLOT для QAbstractButton

Я пишу небольшую утилиту, состоящую из:

1) 4 QToolBar

2) 1 QToolBox

3) 1 QMenu

4) 1 QGraphicsView

У меня есть кнопки на QToolBox, каждая кнопка представляет собой сетку с разным интервалом. Каждый раз, когда пользователь нажимает кнопку на QToolBox the spacing on the QGraphicsScene` меняется.

Я ежедневно использую новую нотацию и никогда не сталкивался с ней, пока мне не пришлось использовать "абстрактную" сущность, такую ​​как QAbstractButton подход.

проблема в том, что я, кажется, не устанавливаю должным образом сигнал / слот подключения QAbstractButton:

mainwindow.h

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void backgroundButtonClicked(QAbstractButton *button);

private:
    void createToolBox();
    QButtonGroup *buttonGroup;
    QButtonGroup *backgroundButtonGroup;

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    createToolBox();

    scene = new DiagramScene(itemMenu,this);
    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(toolBox);
    view = new QGraphicsView(scene);
    QWidget *widget = new QWidget;
    widget->setLayout(layout);
    setCentralWidget(widget);
}

void MainWindow::backgroundButtonClicked(QAbstractButton *button)
{
    QList<QAbstractButton*> buttons = backgroundButtonGroup->buttons();
    foreach (QAbstractButton *myButton, buttons) {
        if(myButton != button)
            button->setChecked(false);
    }
    QString text = button->text();
    if(text == tr("Blue Grid"))
        scene->setBackgroundBrush(QPixmap(":/images/background1.png"));
    else if(text == tr("White Grid"))
        scene->setBackgroundBrush(QPixmap(":/images/background2.png"));
    else if(text == tr("Gray Grid"))
        scene->setBackgroundBrush(QPixmap(":/images/background3.png"));
    else
        scene->setBackgroundBrush(QPixmap(":/images/background4.png"));

    scene->update();
    view->update();
}


void MainWindow::createToolBox()
{
    buttonGroup = new QButtonGroup(this);
    buttonGroup->setExclusive(false);

    QGridLayout *layout = new QGridLayout;
    layout->addWidget(createCellWidget(tr("Conditional"), DiagramItem::Conditional), 0, 0);
    layout->addWidget(createCellWidget(tr("Process"), DiagramItem::Step), 0, 1);
    layout->addWidget(createCellWidget(tr("Input/Output"), DiagramItem::Io), 1, 0);

    QToolButton *textButton = new QToolButton;
    textButton->setCheckable(true);
    buttonGroup->addButton(textButton, InsertTextButton);
    textButton->setIcon(QIcon(QPixmap(":/images/textpointer.png")));
    textButton->setIconSize(QSize(50, 50));
    
    QWidget *itemWidget = new QWidget;
    itemWidget->setLayout(layout);

    backgroundButtonGroup = new QButtonGroup(this);

    // This is my first attempt but it does not work:

    QObject::connect(backgroundButtonGroup, &QAbstractButton::clicked, this, &QAbstractButton::backgroundButtonClicked());


}

Я пробовал разные варианты:

1) via static_cast<> пытаясь бросить это в QAbstractButton как показано ниже:

QObject::connect(static_cast<QAbstractButton*>(backgroundButtonGroup), this, static_cast<QAbstractButton>(backgroundButtonClicked(void)));

2) Также я пробовал следующее согласно официальной документации, но это тоже не сработало:

QObject::connect(backgroundButtonGroup, &QAbstractButton::clicked, this, &QAbstractButton::backgroundButtonClicked);

В дополнение к этому я отвлекся на следующую структуру ниже (заголовок Q_INVOKE), но, боюсь, я слишком усложнил проблему, но просто хотел включить дополнительное решение, которое я пытался изучить:

const bool connected = connect(sender, &Sender::aSignal, 
                               receiver, &Receiver::aSlot);
Q_ASSERT(connected);
Q_UNUSED(connected);

Спасибо, что указали правильное направление для решения этой проблемы.

1 ответ

Решение

У вас есть следующие ошибки:

  • QButtonGroup не имеет clicked сигнал, но buttonClicked.
  • Вы не должны использовать ().

Общий синтаксис: obj, & Class_of_obj, в вашем случае backgroundButtonGroup - это QButtonGroup, а это MainWindow, поэтому предварительно синтаксис следующий:

QObject::connect(backgroundButtonGroup, &QButtonGroup::buttonClicked, this, &MainWindow::backgroundButtonClicked);
  • Но buttonClicked является перегрузкой, тогда вы должны использовать QOverload для указания подписи.

Учитывая вышеизложенное, решение:

QObject::connect(backgroundButtonGroup, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked), this, &MainWindow::backgroundButtonClicked);

Рекомендую проверить:

Другие вопросы по тегам