连接信号和插槽不工作 Qt
Connecting signal and slot not working Qt
我主要是复制、粘贴 中的代码,并在一个新的小程序中实现它们,如下所示:
在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
.
我不知道这里哪里错了。那么我该如何解决这个问题呢?
谢谢。
这正是我的想法,你已经创建了一个名为 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
我主要是复制、粘贴
在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
.
我不知道这里哪里错了。那么我该如何解决这个问题呢?
谢谢。
这正是我的想法,你已经创建了一个名为 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