如何在QPushButtons上使用mousePressEvent

时间:2013-07-22 12:30:22

标签: c++ qt

我已经制作了一些像QPushButton ** btn这样的QPush按钮,我想知道当用户点击其中一个时使用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

的类

4 个答案:

答案 0 :(得分:2)

这是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。映射器允许您在单击其中一个按钮时检索相应按钮的标题。

答案 1 :(得分:0)

我之前有过类似的情况..我有一个QDialog而且我不得不动态添加一些QPushButton ..然后我需要知道用户按下哪个按钮..所以我需要类似的东西:

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

例如信号插槽连接,其中包含单击按钮的id和用于处理单击的功能。每个按钮的功能相同,因为id ..

可以处理特定按钮

实现这个是非常简单的子类化QPushButton添加id和新信号..

希望有所帮助!

答案 2 :(得分:0)

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

然后你可以拨打QObject::sender()

插槽:

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

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

答案 3 :(得分:0)

切换你的

Game::mousePressEvent(QMouseEvent *e) 

ApButton::mousePressEvent(QMouseEvent *e)

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

connect(btn[i][j], SIGNAL(pressed()), this, SLOT(slotButtonPressed());

void Game::slotButtonPressed(){
    //doSomething
}

如果需要在单个方法中识别多个Button或使用QObject :: sender(),请使用QButtonGroup或QSignalMapper,但这有时会很棘手。