【问题标题】:how to use mousePressEvent on QPushButtons如何在 QPushButtons 上使用 mousePressEvent
【发布时间】:2013-07-22 12:30:22
【问题描述】:

我制作了一些 QPushbuttons,例如 QPushButton **btn,我想知道用户何时使用 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的类

【问题讨论】:

  • 您是否尝试将clicked 信号连接到插槽以处理点击?也许您应该以这种方式处理您的逻辑并引用指向您单击的按钮以更改背景颜色的指针。
  • 为什么不使用这样的东西:stackoverflow.com/questions/12292592/…
  • 我的问题不在样式表中...

标签: c++ qt


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    切换你的

    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,但这有时会很棘手。

    【讨论】:

    • 如何声明 i 和 j。你建议我把这个连接函数放在我的循环中吗??
    • 如果你想让你的所有按钮都像这样,把它放在你的 ApButton-Class mousepressevent(*e){ QPushButton::mousePressEvent(e); setStylesheet("Somtehing"); //doSomeMore} 中。如果您只想在按下游戏逻辑时更改某些按钮,请使用信号/插槽连接。将connect() 调用放入您的循环中,并在您的类中添加一个槽(类定义中slots: 区域下的方法)。在此插槽中进行所需的更改。通常:选项 1) 按钮本身将决定何时自行设置样式。选项2)父类(游戏)会告诉按钮改变。
    • 使用 connect()(信号/插槽)你不需要继承 QPushButton。如果您的按钮通常表现不同,您可能仍希望子类化并使用包含 ApButton 的方法来自动更改样式本身。如果您只需要按下/切换/释放事件,您还可以在 ApButton 类中使用 SIGNAL/SLOT 连接并更改其中的工作。如果您想要其他行为而不是标准的按下/释放/单击/切换操作,则覆盖 mousePressEvent(*e) 方法将很有用。
    • 好吧,我也想使用右键单击。所以我想我必须使用 mousePressEvent...
    【解决方案3】:

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

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

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

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

    希望对你有所帮助!

    【讨论】:

    • 谢谢,但是单击和处理中的 int 是什么意思,您的意思是我在两者中都放入了相同的整数作为 id 吗?注意我的 ApButton 是 **btn...
    • 是一个整数作为 id。你可以使用 std::vector
    • 另外一个问题是我也想使用右键单击,我想连接功能不可能...
    • 为什么不呢?你必须编写一个MyQPushbutton 类来为这个左键单击编写你的信号,覆盖mousePressEvent,检查左键,并发出带有id 的信号..
    【解决方案4】:

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

    那你可以拨打QObject::sender()

    在广告位上:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      相关资源
      最近更新 更多