簡體   English   中英

如何在QPushButtons上使用mousePressEvent

[英]how to use mousePressEvent on QPushButtons

我做了一些QPushbuttons,比如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。 映射器允許您在單擊其中一個按鈕時檢索相應按鈕的標題。

我曾經有類似的情況..我有一個QDialog,我不得不在dinamically添加一些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;");
}

獲取單擊的按鈕按鈕並設置其樣式表

切換你的

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,但這有時會很棘手。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM