QT中的QListWidget鼠标按下事件为什么无法获取到当前按下Item

QT中的QListWidget鼠标按下事件为什么无法获取到当前按下Item,第1张

解决方法 :

鼠标点中一项时,QListWidget会发出这信号的,可以用

void currentItemChanged ( QListWidgetItem current, QListWidgetItem previous )

void currentRowChanged ( int currentRow )

void currentTextChanged ( const QString & currentText )

void itemActivated ( QListWidgetItem item )

void itemChanged ( QListWidgetItem item )

void itemClicked ( QListWidgetItem item )

void itemDoubleClicked ( QListWidgetItem item )

void itemEntered ( QListWidgetItem item )

void itemPressed ( QListWidgetItem item )

void itemSelectionChanged ()

这些信号来取得当前点了哪一项,具体看文档

qt中函数paintEvent(QPaintEvent)是被系统自动调用。

paintEvent(QPaintEvent )函数是QWidget类中的虚函数,用于ui的绘制,会在多种情况下被其他函数自动调用。

1QPainter类

这个类主要提供在窗体或者其他绘图设备上进行绘图的功能,在paintEvent(QPaintEvent )中使用如下:

此类中常用的函数有:

drawXXX()函数,用于绘制图形、文字和路径等;

fillXXX()函数,用于填充,可在指定区域内进行填充;

brush()和pen()  笔刷和钢笔的相关 *** 作

2QPainterPath类

这个类为绘图提供容器,主要还是用于描述绘制路径。可以通过函数setFillRule(Qt::WindingFill);来设置填充规则,通过addRect()函数来添加绘制区域。

3QColor类

此类提供颜色支持,这里的颜色可以定义四个属性:QColor ( int r, int g, int b, int a = 255 ),即红、绿、蓝和透明度。除此之外,也可以单个设置这四个值,通过类似setAlpha()的函数即可设置,这对设计渐进效果很有帮助。

下面送上一段摘自别人项目中的代码,仅供参考学习。

Qt的事件是windows的底层消息封装而成的。这个消息和MFC里的消息是同一概念,都是指键盘、鼠标等的按压、松开等消息。例如按下键盘后,windows系统会发出一个 WM_KEYDOWN的消息,Qt捕获这个消息后,将其转换成 Qt::Key_Down 事件。

Qt的事件是较为底层的概念。先有事件,然后才有信号。即:消息 -> 事件 -> 信号

总结:windows发出消息,Qt捕获消息后转换成事件,再由事件处理后发出信号。

一般来说,如果仅仅是使用Qt的控件,那么只需关心这个控件能发出什么信号,但如果需要深一层的定制控件,则需要关心事件,并重写事件处理函数。

QThread中run()的默认实现调用了exec(),从而创建一个QEventLoop对象,由QEventLoop对象处理线程中事件队列(每一个线程都有一个属于自己的事件队列)中的事件。exec()在其内部不断做着循环遍历事件队列的工作,调用QThread的quit()或exit()方法使退出线程,尽量不要使用terminate()退出线程,terminate()退出线程过于粗暴,造成资源不能释放,甚至互斥锁还处于加锁状态。

线程中的事件循环,使得线程可以使用那些需要事件循环的非GUI 类(如,QTimer,QTcpSocket,QProcess)。

在QApplication前创建的对象,QObject::thread()返回NULL,意味着主线程仅为这些对象处理投递事件,不会为没有所属线程的对象处理另外的事件。可以用QObject::moveToThread()来改变对象及其子对象的线程亲缘关系,假如对象有父亲,不能移动这种关系。在另一个线程(而不是创建它的线程)中delete QObject对象是不安全的。除非可以保证在同一时刻对象不在处理事件。可以用QObject::deleteLater(),它会投递一个DeferredDelete事件,这会被对象线程的事件循环最终选取到。假如没有事件循环运行,事件不会分发给对象。假如在一个线程中创建了一个QTimer对象,但从没有调用过exec(),那么QTimer就不会发射它的timeout()信号,deleteLater()也不会工作。可以手工使用线程安全的函数QCoreApplication::postEvent(),在任何时候,给任何线程中的任何对象投递一个事件,事件会在那个创建了对象的线程中通过事件循环派发。事件过滤器在所有线程中也被支持,不过它限定被监视对象与监视对象生存在同一线程中。QCoreApplication::sendEvent(不是postEvent()),仅用于在调用此函数的线程中向目标对象投递事件。

所有界面组件的创建只能在GUI线程(主线程)中完成。子线程与界面组件的通信有两种方式:

A、信号槽方式

B、发送自定事件方式

>

QTime QTime::currentTime () [static]

This is an overloaded member function, provided for convenience

Returns the current time as reported by the system clock

Note that the accuracy depends on the accuracy of the underlying operating system; not all systems provide 1-millisecond accuracy

----------------------------------------------------------------------------------------------------------------

int QTime::msec () const

Returns the millisecond part (0 to 999) of the time

See also hour(), minute(), and second()

----------------------------------------------------------------------------------------------------------------

多用用的Qt的帮助文档程序Assitant,很有用的 qthelp://comtrolltechqt451/qdoc/qtimehtml#currentTime

1、回调函数

一个回调可以认为是一个指向函数的指针。当满足某种条件时,消息处理函数将调用该回调函数进行事件的处理。类似于win32的消息循环机制,当某一事件产生,由系统转化成消息并进入消息循环队列时,应用程序将根据消息的类型来决定对某个回调函数的调用。类似于下面的伪代码:

//消息循环队列

while(getMessageFromSystem(&msg))//一直从系统获取消息(事件)

{

switch(msgtype())

{

case MOUSE_EVENT:

handleMouseEvent();

break;

case KEYBOARD_EVENT:

handleKeyBoardEvent();

break;

}

}

采用这种方式会存在一些缺陷:首先他们不是类型安全的,我们不能保证消息处理函数会采用正确的参数来调用回调函数;其次回调函数对消息处理函数有很强的依赖性,因为消息处理函数必须清楚如何对回调函数进行调用。

2、信号和槽

在qt中,采用了信号和槽作为回调函数的替代方式。当某个事件发生时,某个信号将被发送(emit)出去,而相应的槽将接受该信号进行消息处理。比如窗口中有一个QPushButton m_button,我要通过点击该按钮来实现窗口的关闭。由于按钮被点击之后将发出 clicked() 信号,而窗口的关闭由槽函数 close() 来实现。我们只需要关联信号 clicked() 和槽 close(),代码如下:

connect(&m_button,SIGNAL(clicked()),this,SLOT(close()));

这样我们在点击对象m_button时,将自动关闭该窗口。

由上面可见,信号和槽的连接是通过QObject::connect()函数来实现的。我们可以关联任意的信号和槽,可以将一个信号关联到多个槽,也可以将多个信号关联到一个槽,也可以把一个信号关联到另一个信号,总之有很高的灵活性。信号和槽是相对独立的,它们可以存在于各自的模块之中,要使它们之间建立消息传递的机制,只需要简单的调用connect()

信号和槽避免了上述回调所带来的缺陷,首先信号和槽都会进行严格的参数类型检查,这样也就保证了类型安全;其次,信号和槽是松耦合的,信号发送者不需要关心谁来接受这个信号,它只负责把信号发送出去。而qt的信号和槽机制又保证了在合适的时候调用信号所关联的槽函数(会存在一个信号队列对信号进行管理),同时槽函数也可以作为一个普通的成员函数进行调用。

当然这只是信号和槽的一些最基本的特性,关于qt的信号和槽实现机制可以查看qt assistant中的Meta-Object System,关于connect()函数的详细介绍可以查看QObject::connect()以及QObject::disconnect()函数的详细介绍。

其他相关的文档:qt assistant中的 Signals and Slots 一节

注意:要使用信号和槽机制,需要继承自QObject,并在类的private区域加上Q_OBJECT宏

个人观点,难免有不对之处,望指正

1设置好下面timeEdit的值,然后定义一个每隔一秒便触发的定时器

QTimer timer = new QTimer(this);

connect(timer, SIGNAL(timeout()), this, SLOT(update()));

timer->start(1000);

2在函数update中通过QTime::currentTime()获取系统当前时间,并改变上面timeEdit中的值为当前时间,同时获取下面那个timeEdit中的值,如果两个值相等发送一个信号emit timeEqualSignal()

3连接时间相等信号和槽函数connect(this,SIGNAL(timeEqualSignal()),this,SLOT(slotTimeEqual())),在slotTimeEqual()这个函数中do somethings。

以上就是关于QT中的QListWidget鼠标按下事件为什么无法获取到当前按下Item全部的内容,包括:QT中的QListWidget鼠标按下事件为什么无法获取到当前按下Item、qt中函数paintEvent(QPaintEvent*)是不是被系统自动调用的、QT事件循环等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9651804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存