我已经制作了一些像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
的类答案 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,但这有时会很棘手。