![](/img/trans.png)
[英]How to use mousePressEvent in 2 different classes at the same time QT
[英]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.