3

我已经制作了一些像 QPushButton **btn 这样的 QPushbuttons,我想知道用户何时使用 QMouseEvent 点击其中一个按钮是代码,但这个想法根本没有任何想法?

无效游戏::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

4 回答 4

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

于 2013-07-22T12:52:20.867 回答
0

前段时间我也遇到过类似的情况..我有一个QDialog,我必须动态添加一些QPushButton..然后我需要知道用户按下了哪个按钮..所以我需要类似的东西:

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

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

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

希望能有所帮助!

于 2013-07-22T12:43:27.767 回答
0

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

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

在插槽:

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

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

于 2013-07-22T12:45:44.710 回答
0

切换你的

Game::mousePressEvent(QMouseEvent *e) 

ApButton::mousePressEvent(QMouseEvent *e)

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

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

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

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

于 2013-07-22T12:46:21.540 回答