ylww

随笔仅作学习记录,请辩证参考!!!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 1.鼠标事件

例子:(move方法是为了移动窗口)

默认情况下,只有在按下鼠标按钮(不释放)时移动鼠标,才会产生鼠标移动事件,否则不会产生鼠标移动事件。(也即可以不用写鼠标按下函数中的m_mousePressed标识位变量,这个变量是可以省去的。)

 

mouseMoveEvent事件会随着鼠标的移动一直更新。而鼠标按下与释放事件只是会触发,不会跟随。(重写鼠标移动事件的时候,即使什么都不做,拖住窗口上边框还是可以移动此窗口的,这要做一个区分。鼠标移动事件(默认情况下针对的是除边框区域)并不一定是窗口移动,只是随着鼠标的移动有事件更新。)

ps:

 下图中,pos(),x(),y(),以及geometry()都是指这个窗口针对屏幕的坐标;而若是(一般)部件的pos()与geometry()都是(自己的左上角)针对的父级窗口(父级窗口不包括边框的那个左上点)。

 

这里提两个函数:Qt mapToGlobal 以及 mapToParent 理解要点_qml maptoglobal_wangjieest的博客-CSDN博客

 此外:qtQMouseEvent中的局部坐标pos()和全局坐标globalpos()_qmouseevent 坐标_qq_20853741的博客-CSDN博客  (pos并不是在所有情况下就是局部坐标,在QCursor.pos()时就是全局坐标的意思。相对于整个屏幕)

增加(开开眼界):

#include <QApplication>

#include <QMouseEvent>

void xxxx::mousePressEvent(QMouseEvent *event){

//qApp是当前应用程序实例的全局对象,程序跑起来后,应用程序就是qApp.

if (qApp->widgetAt(event->pos()) != ui.searchLineEdit && ui.searchLineEdit->hasFocus()) {
ui.searchLineEdit->clearFocus();
}

}

 

2.键盘事件

 实现:通过QPainter画家在QPixmap位图上面进行绘制虚线和添加QImage的图片,重写重绘事件:QPainter画家在this类中(painter.begin(this))绘制此位图QPixmap。updata()函数会触发窗口重绘。

此类中,由于先将图片与线条画在了位图上,所以需要重绘事件来将此位图显示在窗口中(通过this),那么不进行重绘(声明没写/声明写了但函数为空),直接在drawpix()函数中一步到位可行吗?答:不可行。 (这里我的猜想是,直接drawpix()一步到位的时候,是在this中绘制了,但是由于之后的重绘事件的触发,刷掉了效果)

追加:QPainter painter(this);这不是指定父类(QPainter不能指定父类),指定画的地方(this)。   注意事项:QPainter::begin: Painter already active问题解决方案_繁星蓝雨的博客-CSDN博客

QPainter也可以在QImage上进行绘图;还有QPainter的drawPixmap方法有多个重载,其中(可以只画出图片的部分):

 

 

 

3.事件过滤

 installEventFilter方法 给对象objA安装objB的事件过滤器,这样objB对象的eventFilter方法中就可以接收到objA对象的所有事件了,如果objA对象不想objB对象再监听自己的事件了就使用 removeEventFilter方法移除objB对象对事件的监听。

QObject* objA = new MyQObjectA;QObject* objB = new MyQObjectB;// 安装事件过滤器;    objA->installEventFilter(objB);// 移除事件过滤器;objA->removeEventFilter(objB);
bool QObject::eventFilter(QObject *watched, QEvent *event)
posted on 2023-02-22 10:06  理想主义者光芒万丈  阅读(50)  评论(0)    收藏  举报