【发布时间】: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