0

我目前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 signal一个:slotMainWindow 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);

这是行不通的。

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

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

4

0 回答 0