如何在QPushButtons上使用mousePressEvent

how to use mousePressEvent on QPushButtons

本文关键字:mousePressEvent QPushButtons      更新时间:2023-10-16

我制作了一些QPushButton,比如QPushButton**btn,我想知道用户何时使用QMouseEvent点击其中一个按钮。这是代码,但这个想法根本不起作用。有什么想法吗??

void Game::mousePressEvent(QMouseEvent*ev){

if(ev->button() == Qt::LeftButton)
{
    btn[ev->x()][ev->y()].setStyleSheet("background-color : black;");
}
else
{
   btn[ev->x()][ev->y()].setStyleSheet("background-color : red;");
}

其他部分用于右键单击这是生成按钮的代码

void Game::MakeButton()
{
    btn = new ApButton*[column];
    hrztl = new QHBoxLayout[column];
    hrztl->setSpacing(0);
    for(int i=0; i<column;i++)
    {
        btn[i] = new ApButton[row];
        for(int j=0; j<row; j++)
        {
            btn[i][j].setRowCol(i,j);
            btn[i][j].setFixedSize(50,50);
            hrztl[i].addWidget(&btn[i][j]);
        }
        ui->MainLayout->addLayout(&hrztl[i]);
    }
    ui->MainLayout->setSpacing(0);
}

ApButton是一个继承QPushButton 的类

这是QSignalMapper的一个很好的使用示例,如下所示:http://qt-project.org/doc/qt-5.0/qtcore/qsignalmapper.html#details

ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent)
    : QWidget(parent)
{
    signalMapper = new QSignalMapper(this);
    QGridLayout *gridLayout = new QGridLayout;
    for (int i = 0; i < texts.size(); ++i) {
        QPushButton *button = new QPushButton(texts[i]);
        connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
        signalMapper->setMapping(button, texts[i]);
        gridLayout->addWidget(button, i / 3, i % 3);
    }
    connect(signalMapper, SIGNAL(mapped(QString)),
            this, SIGNAL(clicked(QString)));
    setLayout(gridLayout);
}

在该示例中,每个按钮都由其标题标识为QString。映射器允许您在单击其中一个按钮时检索相应按钮的标题。

切换

Game::mousePressEvent(QMouseEvent *e) 

ApButton::mousePressEvent(QMouseEvent *e)

因为您正在尝试实现按钮的按下事件。如果你只想有按下按钮的那一刻,而不想改变按钮的行为,请使用SIGNAL/SLOT连接,而不是重新实现事件(添加到你的创建中):

connect(btn[i][j], SIGNAL(pressed()), this, SLOT(slotButtonPressed());
void Game::slotButtonPressed(){
    //doSomething
}

如果您需要在一个方法中识别多个按钮,请使用QButtonGroup或QSignalMapper,或者使用QObject::sender(),但这有时可能很棘手。

我以前也遇到过类似的情况。。我有一个Q对话框,我不得不添加一些QPushButton。。那么我需要知道用户按下了哪个按钮。。所以我需要这样的东西:

connect( btn, SIGNAL( clicked(int) ),
         this, SLOT( handle(int) ));

例如,具有被点击按钮的id的信号槽连接和用于处理点击的函数。每个按钮的功能都是相同的,并且由于id的原因可以处理特定的按钮。

实现这一点非常简单,将QPushButton子类化,添加一个id和一个新信号。。

希望能有所帮助!

如果Apbutton继承了QPushButton,为什么不连接到clicked()?

然后可以调用QObject::sender()

插槽上:

ApButton *but = dynamic_cast<ApButton*>QObject::sender()
if(but)
{
   but->setStyleSheet("background-color : black;");
}

以获取单击的按钮并设置其样式表