C++ QAbstractButton的信号槽新符号存在问题

C++ QAbstractButton的信号槽新符号存在问题,c++,c++11,qt5,qbuttongroup,qabstractbutton,C++,C++11,Qt5,Qbuttongroup,Qabstractbutton,我正在编写一个由以下内容组成的小实用程序: 1)4QToolBar 2)1QToolBox 3)1QMenu 4)1QGraphicsView 我在QToolBox上有一些按钮,每个按钮代表一个具有不同间距的网格。 每次用户单击QToolBox上的按钮,qgraphicscene`上的间距都会发生变化 我每天都使用新的表示法,在使用“抽象”实体(如QAbstractButton方法)之前,我从未遇到过任何问题 我遇到的问题是,我似乎没有正确设置QAbstractButton的连接信号/插槽: m

我正在编写一个由以下内容组成的小实用程序:

1)4
QToolBar

2)1
QToolBox

3)1
QMenu

4)1
QGraphicsView

我在
QToolBox
上有一些按钮,每个按钮代表一个具有不同间距的网格。 每次用户单击
QToolBox上的按钮,
qgraphicscene`上的间距都会发生变化

我每天都使用新的表示法,在使用“抽象”实体(如
QAbstractButton
方法)之前,我从未遇到过任何问题

我遇到的问题是,我似乎没有正确设置
QAbstractButton
的连接信号/插槽:

main window.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;
main window.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());


}
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);

感谢您为解决此问题指明了正确的方向。

您有以下错误:

  • QButtonGroup没有单击
    的信号,但是单击了
    按钮
  • 您不能使用
    ()
通常的语法是:obj,&Class_of_obj,在您的例子中backgroundButtonGroup是QButtonGroup,这是主窗口,因此语法是:

QObject::connect(backgroundButtonGroup, &QButtonGroup::buttonClicked, this, &MainWindow::backgroundButtonClicked);
  • 但是按钮单击时过载,则必须使用q过载指示签名
考虑到上述情况,解决方案是:

QObject::connect(backgroundButtonGroup,QOverload::of(&QButtonGroup::buttonClicked),this,&MainWindow::backgroundButtonClicked);
我建议您检查:

  • 其中显示了如何建立连接的示例

  • 除此之外,还指出了各种情况


    • 您有以下错误:

      • QButtonGroup没有单击
        的信号,但是单击了
        按钮
      • 您不能使用
        ()
      通常的语法是:obj,&Class_of_obj,在您的例子中backgroundButtonGroup是QButtonGroup,这是主窗口,因此语法是:

      QObject::connect(backgroundButtonGroup, &QButtonGroup::buttonClicked, this, &MainWindow::backgroundButtonClicked);
      
      • 但是按钮单击时过载,则必须使用q过载指示签名
      考虑到上述情况,解决方案是:

      QObject::connect(backgroundButtonGroup,QOverload::of(&QButtonGroup::buttonClicked),this,&MainWindow::backgroundButtonClicked);
      
      我建议您检查:

      • 其中显示了如何建立连接的示例

      • 除此之外,还指出了各种情况


      @eyllanesc,谢谢你过来看问题。这是下面的用户建议的,但并没有解决问题。我遇到了一个奇怪的错误:
      backgroundButtonClicked不是QAbstractButton的成员
      @eyllansc,谢谢你过来看问题。这是下面的用户建议的,但并没有解决问题。我遇到了一个奇怪的错误:
      backgroundButtonClicked不是QAbstractButton的成员
      Ok,谢谢上一个工作!感谢您指出具体的问题。我还看到
      @QAbstractButton::backgroundButtonClicked
      ,但实际上是
      @main window::backgroundButtonClicked
      :)@Emanuele它可能值得您尝试
      QButtonGroup::buttonoggled
      ,而不是
      buttonClicked
      ,因为您正在使用选中的按钮OK感谢上一个工作!感谢您指出具体的问题。我还看到
      @QAbstractButton::backgroundButtonClicked
      ,但实际上是
      @MainWindow::backgroundButtonClicked
      :)@Emanuele如果您使用的是选中按钮,那么您可能值得尝试
      QButtonGroup::buttonoggled
      而不是
      buttonClicked