【问题标题】:Connecting signal and slot not working Qt连接信号和插槽不起作用 Qt
【发布时间】:2017-11-25 03:12:53
【问题描述】:

我主要是从Here 复制、粘贴代码,然后在一个新的小程序中实现它们,如下所示:
mybutton.h:

class MyButton : public QPushButton
{
 Q_OBJECT

public:
    MyButton(QWidget *parent = Q_NULLPTR);

    QVector<MyButton*> buttons;

private slots:
    void mousePressEvent(QMouseEvent *e) {
        if(e->button()==Qt::RightButton) {
            emit btnRightClicked();
            qDebug() << "Emitted";
        }
    }

signals:
    void btnRightClicked();
};

mainwindow.cpp:

MyButton mButtons;

QWidget *mWidget = new QWidget(this);
QGridLayout *gLayout = new QGridLayout(mWidget);

mButtons.buttons.resize(5);
for(int i = 0; i < 5; i++) {
    mButtons.buttons[i] = new MyButton(mWidget);
    gLayout->addWidget(mButtons.buttons[i], 0, i);
}

mWidget->setLayout(gLayout);
setCentralWidget(mWidget);

connect(&mButtons, SIGNAL(btnRightClicked()), this, SLOT(onRightClicked()));

onRightClicked 插槽是这样的:

void MainWindow::onRightClicked() 
{
    qDebug() << "clicked";
}

但调试出来的只有这个:Emitted.
我不知道这里哪里错了。那么我该如何解决这个问题呢?

谢谢。

【问题讨论】:

  • 首先,停止使用旧的信号槽语法并切换到new syntax。这会在编译时而不是在运行时引发错误,这使得它们更容易被发现。其次,我不确定这里是否有足够的代码来确定出了什么问题。第三,您的 MyButton 类包含指向更多 MyButton 对象的指针向量——虽然这可能与问题无关,但它肯定是一种奇怪的 GUI 编程方式。
  • @MrEricSir 但我想我提供了那个小程序中的所有代码来测试右键单击事件是否有效。我不知道我还能提供什么代码,因为这就是全部。还有什么是制作更多按钮对象的更好方法?
  • 问题是你创建了MyButton mButtons;一个函数内。函数中创建的变量只存在于函数执行过程中,淘汰后,建议你将mButtons设为类的成员。
  • @eyllanesc 在测试之前,我将 mButtons 设为该类的成员,但为了简洁起见,我只是将 mButton 对象放在那里。所以我认为这不是问题所在。
  • 为什么要在 MyButton 里面创建一个 QVector 按钮? ——

标签: c++ qt qt5 qt-signals qt-slot


【解决方案1】:

这正是我的想法,您创建了一个名为 mButtons,并且您已连接到您的信号,但是该按钮没有父级没有可视化,因为它在您完成执行构造函数时被删除,这并不意味着您保存在 QVector 中的指针已从内存中删除,但它们仍然存在并发出信号,但这些未连接到任何插槽。

你要做的是创建一个只发出信号的按钮:

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QMouseEvent>
#include <QPushButton>
#include <QDebug>

class MyButton : public QPushButton
{
 Q_OBJECT

public:
    MyButton(QWidget *parent = Q_NULLPTR):QPushButton(parent){

    }

protected:
    void mousePressEvent(QMouseEvent *e) {
        if(e->button()==Qt::RightButton) {
            emit btnRightClicked();
            qDebug() << "Emitted";
        }
    }

signals:
    void btnRightClicked();
};
#endif // MYBUTTON_H

然后您创建一个按钮容器,并在循环中创建按钮并连接它:

*.h

private slots:
    void onRightClicked();

private:
    QVector<MyButton *> mButtons;
};

*.cpp

QWidget *mWidget = new QWidget(this);
QGridLayout *gLayout = new QGridLayout(mWidget);
for(int i = 0; i < 5; i++) {
    MyButton *btn = new MyButton(mWidget);
    gLayout->addWidget(btn, 0, i);
    connect(btn, &MyButton::btnRightClicked, this, &MainWindow::onRightClicked);
    mButtons << btn;
}

mWidget->setLayout(gLayout);
setCentralWidget(mWidget);

您可以在以下link下载示例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2016-11-10
    相关资源
    最近更新 更多