好的,所以代码很短,如下所示:
MainWindow::MainWindow() :
QMainWindow(),
ui(new Ui::MainWindow)
{
//ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow:: mouseDoubleClickEvent ( QMouseEvent * event )
{
cout << "being double clicked" << endl;
}
void MainWindow:: mousePressEvent(QMouseEvent *){
cout << "being clicked once " << endl;
}
setupUi 被削减,在这种情况下输出很好,当我双击时,它显示“正在双击”消息。
但是,!!!当我设置用户界面时,它停止工作!该消息将不再显示...!!!
有人可以解释一下原因吗!非常感谢,这个很紧急!!!!!!!!!
鼠标单击事件将始终发送到您单击的对象。这意味着如果您有例如一个横跨整个主窗口的按钮,然后双击该按钮,将调用
QPushButton::mouseDoubleClickEvent()
而不是主窗口中的事件。
如果您不想在子窗口小部件的子类中实现这些功能,或者您的子窗口小部件不提供类似
clicked()
信号之类的功能,您可以使用事件过滤器技术:
http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#installEventFilter
我知道你的问题是十年前提出的。 我是一名考古学家,我已经成功地进行了挖掘;) - 这是一个笑话。
这对某些人来说可能很奇怪,但我认为回答未解答的问题是值得的,因为我一直在寻找问题的解决方案并自己解决了它。互联网上充斥着未解答的问题。
你的解决方案出现在搜索引擎中,因为我有完全相同的问题,实际上我已经解决了。
老实说,重新加载虚拟函数对我来说也不起作用。也许有更多知识的人可以评论为什么以下功能不想工作?
virtual void mouseDoubleClickEvent(QMouseEvent *event)
<- why doesn't this feature work?
仅重新加载虚拟函数才有效
virtual bool event(QEvent *event)
文件
mycalendarwidget.h
#define MYCALENDARWIDGET_H
#include <QCalendarWidget>
#include <QObject>
#include <QMouseEvent>
class MyCalendarWidget : public QCalendarWidget
{
Q_OBJECT
public:
MyCalendarWidget(QWidget *parent=nullptr);
// QObject interface
public:
virtual bool event(QEvent *event) override;
signals:
void myClicked(bool checked=false);
};
#endif // MYCALENDARWIDGET_H
文件
mycalendarwidget.cpp
MyCalendarWidget::MyCalendarWidget(QWidget *parent) : QCalendarWidget(parent)
{
}
bool MyCalendarWidget::event(QEvent *event)
{
if(event->type()==QEvent::MouseButtonRelease){
emit myClicked(true);
return true;
}
return false;
}
在
mainwindow.cpp
的某个地方
myCalendar = new MyCalendarWidget(this);
myCalendar->setGridVisible(false);
QObject::connect(myCalendar, &MyCalendarWidget::myClicked, this, [](){qInfo()<< "slot two mouse clicked";});
程序运行截图