如何连接到Qt的mousePressEvent槽函数

3
在“类按钮”中,我有一个“btnRightClicked”信号和一个“mousePressEvent”槽:
void Buttons::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::RightButton) {
        emit btnRightClicked();
    }
}

mainwindow.cpp 中,我将 btnRightClicked 信号连接到 onRightClicked 槽,代码如下:

connect(&mButtons, SIGNAL(btnRightClicked()), this, SLOT(onRightClicked()));
< p > onRightClicked 插槽的用法如下:

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

但是我运行了这个程序,什么也没有发生。我猜测原因是因为我没有连接到 mousePressEvent 插槽。我对Qt还比较新,不知道我是否正确。

我在中央窗口部件上设置了一些按钮,我希望当右键单击它们时,它们能够触发右键单击事件。那么我该如何使其正常工作呢?

谢谢。

编辑:button.h 中:

class Buttons : public QObject
{
    Q_OBJECT
public:
    Buttons();
    QVector<QPushButton*> buttons;

    void setButtons(int totalBtns) {
        for(int i = 0; i < totalBtns; i++) {
            buttons[i]->setObjectName(QString::number(i));
            buttons[i]->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
        }
    }

public slots:
    void mousePressEvent(QMouseEvent *e) {
        if(e->button() == Qt::RightButton) {
            emit btnRightClicked();
        }
    }

signals:
    void btnRightClicked();
};

@Simon,我展示了button.h文件,这对解决问题足够了吗?然后我在mainwindow.cpp中设置了按钮并连接了btnRightClicked信号。 - Theodore Tang
1
首先,在“emit btnRightClicked();”处设置一个断点,并检查是否到达该行。即确保您的信号已发出。如果是,则检查您的连接。如果连接正常,请检查接收对象是否与插槽相关的设计合理。 - vahancho
展示你的代码。可能出现的错误在这里:connect(&mButtons, ...mButtons是什么?你在输出日志中看到了什么? - Dmitry Sazonov
@DmitrySazonov 我声明这样:在mainwindow.h文件中,有一个名为mButtons的按钮,但是我在输出日志中没有看到任何东西。我猜测它们并没有真正连接起来。 - Theodore Tang
@TheodoreTang 给 mousePressEvent 添加一个 override 关键字会给你一些提示。@Simon 提供了正确的答案。mousePressEventQWidget 的虚方法,你应该重写它。但是你创建了自己的类,没有任何逻辑来调用你自己的 mousePressEvent 方法。 - Dmitry Sazonov
显示剩余3条评论
1个回答

4
为了在您的小部件上获得鼠标右键单击功能,您需要实现自己的按钮小部件。
class MyButton : public QPushButton
{
 Q_OBJECT

public:
    MyButton(QWidget *parent = Q_NULLPTR);

private slots:
    void mousePressEvent(QMouseEvent *e);

signals:
    void btnRightClicked();
};

cpp

MyButton:MyButton(QWidget * parent) : 
    QPushButton(parent)
{
}
void MyButton::mousePressEvent(QMouseEvent *e)
{
    if(e->button()==Qt::RightButton)
        emit btnRightClicked();

    //this forwards the event to the QPushButton
    QPushButton::mousePressEvent(e);
}

在您的按钮类中,将按钮向量更改为:
 QVector<MyButton*> buttons;

然后,将你的 MyButton 的右键单击事件注册到 Buttons 类中的信号,然后将该信号转发到你的 mainWindow

connect(&mButtons, &Buttons::btnRightClicked,
        this,      &MainWindow::onRightClicked);

1
另一种方法是在按钮上安装事件过滤器。 - Dmitry Sazonov
我按照你说的方法尝试了一下,主要是复制并粘贴了你提供的代码,并将它们实现在一个小的新程序中。我测试了一下右键单击按钮时是否发出信号,确实是发出了。但问题是:我无法使onRightClicked槽函数起作用。这里有什么问题吗?我应该打开一个新页面来展示代码,这样你就知道哪里出了问题了吗? - Theodore Tang
@TheodoreTang,请更新您的问题,以便我们可以看到相关更改。并提供完整的代码示例。您还没有这样做。 - Dmitry Sazonov
1
@DmitrySazonov 我已经解决了这个问题。当我第一次看到答案并尝试将其实现到我的代码中时,它并没有起作用。因此,即使Simon提供了正确的答案,我当时也没有接受这个答案。后来,当我理解更多并让我的代码工作时,实现看起来就像Simon提供的一样。之后我只是忘记接受Simon的答案。也许这就是你认为我仍然有问题并需要编辑的原因。我认为在解决了问题之后,我不应该再编辑这个了,对吧? - Theodore Tang
@TheodoreTang,现在我看到你接受了一个答案。通知社区解决方案是一个很好的举止,这样他们就会花更少的时间来找到正确的答案。 - Dmitry Sazonov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接