gpt4 book ai didi

c++ - Qt : get mouse pressed event even if a button is pressed

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:47:02 27 4
gpt4 key购买 nike

我需要简单地检测每时每刻在我的 Qt5/C++ 应用程序中何时按下或释放右键。

到目前为止,我已经编写了这些函数:

void test::mousePressEvent(QMouseEvent *ev){
if(ev->buttons() == Qt::LeftButton){
qDebug() << "Left pressed";
ui->forceBar->setValue( 100 );
}

}

void test::mouseReleaseEvent(QMouseEvent *ev){
if(ev->button() == Qt::LeftButton){
ui->forceBar->setValue( 50 );
qDebug() << "Left released";
}

只有当点击不是在 pushbuttontest 上时,它们才能正常工作。问题是,如果点击发生在按钮上,我不会收到事件。

最佳答案

您必须从 QPushButton 派生并覆盖这些事件处理程序。

class MyButton : public QPushButton
{
protected:
virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseReleaseEvent(QMouseEvent* event);
};


void MyButton::mousePressEvent(QMouseEvent *ev){
if(ev->buttons() == Qt::LeftButton){
qDebug() << "Left pressed";
ui->forceBar->setValue( 100 );
}

}

void MyButton::mouseReleaseEvent(QMouseEvent *ev){
if(ev->button() == Qt::LeftButton){
ui->forceBar->setValue( 50 );
qDebug() << "Left released";
}

然后,将此按钮用作pushbuttontest:

QPushButton* pushbuttontest = new MyButton();

或者,如果您想为许多小部件使用一个通用的事件处理程序,您可以使用事件过滤器:

class test : public QWidget // the widget in which you want to capture all events
{
public:
bool eventFilter(QObject *watched, QEvent *e);
private:
QPushButton* pushbuttontest;
QLabel *myLabel;
};

bool test::eventFilter(QObject *watched, QEvent *e)
{
if (e->type() == QEvent::MouseButtonPress))
{
QMouseEvent* ev = (QMouseEvent*)e;
if(ev->buttons() == Qt::LeftButton){
qDebug() << "Left pressed";
ui->forceBar->setValue( 100 );
}
}
else if (e->type() == QEvent::MouseButtonRelease)
{
QMouseEvent* ev = (QMouseEvent*)e;
if(ev->buttons() == Qt::LeftButton){
qDebug() << "Left released";
ui->forceBar->setValue( 100 );
}
}
return false;// return true if you are finished handling the event. So, the default event handler will not be called.
}

然后,将 eventFilter 安装到您想要的小部件:

pushbuttontest = new QPushButton();
pushbuttontest->instalEventFilter(this); // this is the test class object which has our event filter code.
myLabel = new QLabel();
myLabel->installEventFilter(this);

等等

请注意,我没有编译这段代码。它可能不会立即生效。

更多信息:http://qt-project.org/doc/qt-4.8/eventsandfilters.html

关于c++ - Qt : get mouse pressed event even if a button is pressed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20722823/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com