Qt事件处理机制

一.自定义事件的发送和接收

Qt中的事件处理机制,通过系统的事件处理层层传递,一直到直接接收事件的对象。
Qt中事件发送的行数有两个:

QApplication::sendEvent(QObject *receiver, QEvent *event);

QApplication::postEvent(QObject *receiver, QEvent *event);

参数QObject *receiver: 表明事件发送的对象
参数QEvent *event:发送的事件对象

sendEvent和postEvent这两个函数的区别在于:

sendEvent:
Sends event event directly to receiver receiver, using the notify() function. Returns the value that was returned from the event handler.
The event is not deleted when the event has been sent. The normal approach is to create the event on the stack

直接发送事件给接收者,是阻塞的,等待事件处理完成才返回
postEvent
Adds the event event, with the object receiver as the receiver of the event, to an event queue and returns immediately.
The event must be allocated on the heap since the post event queue will take ownership of the event and delete it once it has been posted. It is not safe to access the event after it has been posted.
When control returns to the main event loop, all events that are stored in the queue will be sent using the notify() function.
发送到消息队列,是非阻塞,发送完成后直接返回

自定义事件:

#pragma once
#include <QObject>
#include <QEvent>
#include <QString>

class MyEvent :public QObject, public QEvent {
	Q_OBJECT

public:
	MyEvent();
	~MyEvent();

	static QEvent::Type getMyEventType() {
		return _myEventType;
	}

	void setInfo(QString info);
	QString&getInfo() {
		return _info;
	}
private:
	static QEvent::Type _myEventType;

	QString _info;
};
#include "MyEvent.h"
MyEvent::Type MyEvent::_myEventType = (QEvent::Type)QEvent::registerEventType(QEvent::User + 100);

MyEvent::MyEvent()
	: QEvent(_myEventType) {
}

MyEvent::~MyEvent() {
}

void MyEvent::setInfo(QString info) {
	_info = info;
}

调用

//发送事件
void QtWidgetsEvent::slotSendEvent() {
	MyEvent* e = new MyEvent();
	e->setInfo("Sucess!");
#if 1//阻塞发送
	QApplication::sendEvent(this, e);
#else //非阻塞发送
	QApplication::postEvent(this, e);
#endif
}

//接收事件
bool QtWidgetsEvent::event(QEvent *e) {
	if (e->type() == MyEvent::getMyEventType()){
		MyEvent* myEvent = dynamic_cast<MyEvent*>(e);
		qDebug()<< myEvent->getInfo();
	}

	return QWidget::event(e);
}

二、事件过滤器

在这里插入图片描述
当输入姓名之后点击回车键,光标直接跳到序号上面;学号输入完成之后,点击回车键,光标直接跳到信息的编辑框上面;

事件过滤器:对象A用来监视发送给对象B的事件。当有事件发送给对象B时,首先对象A会接收到,并且处理掉

  1. 首先在初始化的时候,对象B调用函数 installEventFilter(A) 添加事件过滤器,参数就是对象A。说明B的事件要通过A来处理;
	//添加事件过滤器
	ui.lineEditName->installEventFilter(this);
	ui.lineEditID->installEventFilter(this);
	ui.lineEditInfo->installEventFilter(this);
  1. A对象实现虚函数:
bool QtWidgetsEvent::eventFilter(QObject *watched, QEvent *event) {
	if (watched == ui.lineEditName && event->type() == QEvent::KeyPress) {
		QKeyEvent* key = dynamic_cast<QKeyEvent*>(event);
		if (key->key() == Qt::Key_Enter){//回车键
			ui.lineEditID->setFocus();
		}
	} else if(watched == ui.lineEditID && event->type() == QEvent::KeyPress) {
		QKeyEvent* key = dynamic_cast<QKeyEvent*>(event);
		if (key->key() == Qt::Key_Enter) {//回车键
			ui.lineEditInfo->setFocus();
		}
	}
	return QWidget::eventFilter(watched, event);
}

aaa

<think>好的,用户想要安装或配置VMware Tools。首先,我需要回忆一下相关的步骤。根据之前提供的引用内容,安装过程主要涉及卸载开源的open-vm-tools,挂载ISO文件,解压并运行安装脚本。 首先,用户可能需要确认当前是否已经安装了open-vm-tools,因为如果VMware Tools项是灰色的,通常需要先卸载它。引用[1]和[2]都提到需要卸载open-vm-tools,并且在卸载后重启虚拟机。这一步很重要,否则可能导致冲突。 接下来是挂载ISO文件。根据引用[3],正确的ISO文件来源是VMware提供的特定链接。用户需要下载该ISO,然后在虚拟机设置中将其映射为虚拟光驱。如果用户使用的是Linux系统,可能需要手动挂载ISO到目录,比如/mnt/cdrom。 然后,用户需要将.tar.gz文件拷贝到其他目录并解压。这里需要注意的是权限问题,可能需要使用sudo来执行解压和安装命令。执行vmware-install.pl脚本时,可能会遇到依赖问题,比如缺少gcc或make工具,这时候需要提前安装这些依赖包。 此外,安装过程中可能会提示用户安装路径或其他配置项,通常情况下默认项即可。安装完成后,重启虚拟机以确保VMware Tools生效。如果遇到问题,可能需要查看日志文件或者参考引用[2]中的卸载和重新安装步骤。 用户可能还会关心如何验证VMware Tools是否安装成功。可以通过检查虚拟机设置中的VMware Tools状态,或者在终端运行命令查看服务是否运行。例如,在Linux系统中,可以执行systemctl status vmware-tools.service。 最后,需要提醒用户确保虚拟机处于运行状态,并且在安装过程中保持网络连接,以便下载可能的依赖包。如果用户使用的是同版本的VMware同的操作系统,步骤可能会有所同,需要参考官方文档或相应指南。</think>### VMware Tools 安装步骤 #### 1. **卸载开源的 open-vm-tools** - 如果虚拟机安装开源版本的 VMware Tools(如 `open-vm-tools`),需先卸载以避免冲突: ```bash sudo apt-get remove open-vm-tools # Ubuntu/Debian # 或 sudo yum remove open-vm-tools # CentOS/RHEL ``` - 卸载完成后重启虚拟机[^1][^2]。 #### 2. **挂载 VMware Tools ISO 文件** - **虚拟机设置**:在 VMware 界面虚拟机 -> “虚拟机”菜单 -> “安装 VMware Tools”。 - 若灰色,手动挂载 ISO: - 下载官方 ISO(如引用[3]提供的链接)。 - 在虚拟机设置中,将 ISO 文件映射到虚拟光驱[^2][^3]。 #### 3. **解压并安装** - **挂载 ISO**(Linux 示例): ```bash sudo mkdir /mnt/cdrom sudo mount /dev/cdrom /mnt/cdrom ``` - **拷贝并解压安装包**: ```bash cp /mnt/cdrom/VMwareTools-*.tar.gz /tmp/ cd /tmp tar -xzf VMwareTools-*.tar.gz ``` - **运行安装脚本**: ```bash cd vmware-tools-distrib/ sudo ./vmware-install.pl # 按提示完成安装 ``` - 安装完成后重启虚拟机[^3]。 #### 4. **验证安装** - 检查 VMware Tools 服务状态: ```bash systemctl status vmware-tools ``` - 在虚拟机设置中确认 VMware Tools 显示为“已安装”。 --- ### 常见问题解决 - **依赖缺失**:安装前确保已安装 `gcc`、`make`、`kernel-headers` 等开发工具。 - **权限问题**:使用 `sudo` 执行安装命令。 - **安装失败**:检查日志 `/var/log/vmware-tools-install.log`。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值