我主要是复制,粘贴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
我不知道这里哪里出错了。那我怎么解决这个问题呢?
感谢。
答案 0 :(得分:1)
这正是我的想法,你已经创建了一个名为mButtons,并且你已经连接到你的信号,但是那个按钮没有父可视化,因为它在你完成执行构造函数时被删除了,这并不意味着您在QVector中保存的指针会从内存中删除,但它们会保留并发出信号,但这些信号并未连接到任何插槽。
您需要做的是创建一个仅发出信号的按钮:
fit
然后创建一个按钮容器,在循环中创建按钮并连接它:
<强> *的.h 强>
#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
<强> *。CPP 强>
private slots:
void onRightClicked();
private:
QVector<MyButton *> mButtons;
};
您可以在以下link
中下载该示例