在Qt中处理QMouseEvent的正确方法

时间:2017-11-26 12:37:15

标签: qt qpushbutton qmouseevent

我目前在扫雷游戏中遇到QPushButton右键点击事件的问题。根据我的理解,如果我想为QPushButton提供正确的点击事件,我必须做这样的事情:
Buttons Class

class Buttons : public QPushButton
{
    Q_OBJECT

public:
    Buttons(QWidget *parent = Q_NULLPTR);

signals:
    void btnRightClicked();

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

然后在mainwindow.cpp中创建一个这样的对象:

Buttons *mButtons = new Buttons(this);

并将btnRightClick signalslot中的MainWindow Class连接起来:

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

这很有效,但由于它是一个扫雷游戏,我需要很多按钮。我想知道每次我需要一个有正确点击事件的按钮时,我是否需要像上面那样创建一个新对象?

例如,如果我想要64 QPushButtons,我是否必须像这样创建64个对象?

for(int i = 0; i < 8; i++) {
    for(int j = 0; j < 8; j++) {
        Buttons *mButton = new Buttons(mCentralWidget);
        mGridLayout->addWidget(mButton, i * 8, j);
        connect(mButton, &Buttons::btnRightClicked, this, &MainWindow::onRightClicked);
    }
}

对我来说,创造这么多物体可能听起来有点疯狂。有没有办法只创建一个包含许多QPushButtons具有右键单击事件的对象?
请允许我提出另一个问题,即使我必须创建这么多对象,每次单击其中一个时,该对象应该隐藏或消失。我试过这个:

connect(mButton, &Buttons::clicked, mButton, &Buttons::hide);

不能正常工作。

希望我能清楚地解释我的问题。那么我该如何解决这些问题呢?或者是否有任何关于在扫雷游戏中处理右键事件的建议?

任何建议将不胜感激,谢谢。

0 个答案:

没有答案
相关问题