Qt学习笔记2

1.鼠标事件

在Qt中,鼠标事件是用户与应用程序交互的重要方式之一。Qt框架提供了一系列的事件和方法来处理鼠标的各种操作,包括点击、移动、释放等。以下是一些常见的鼠标事件以及它们在Qt中的处理方式:

mousePressEvent(QMouseEvent *event): 当用户按下鼠标按钮时,此事件被触发。你可以重写这个方法来处理鼠标按下事件,例如,用于开始拖动操作或选择界面元素。

mouseMoveEvent(QMouseEvent *event): 当鼠标在控件上移动时,此事件被连续触发。这个方法可以用来跟踪鼠标的位置,或者在鼠标移动时执行某些操作,如调整工具提示的显示位置。

mouseReleaseEvent(QMouseEvent *event): 当用户释放鼠标按钮时,此事件被触发。这个方法通常用于结束拖动操作或确认用户的选择。

mouseDoubleClickEvent(QMouseEvent *event): 当用户快速连续点击鼠标两次时,此事件被触发。双击事件通常用于放大视图、打开文件或其他需要快速确认的操作。

wheelEvent(QWheelEvent *event): 当用户使用鼠标滚轮时,此事件被触发。滚轮事件可以用来实现滚动条的滚动、缩放视图等功能。

enterEvent(QEvent *event) 和 leaveEvent(QEvent *event): 当鼠标进入或离开控件的区域时,这些事件被触发。这些事件可以用来改变控件的外观,例如,当鼠标悬停在按钮上时改变按钮的颜色。

hoverEnterEvent(QHoverEvent *event) 和 hoverLeaveEvent(QHoverEvent *event): 当鼠标悬停在控件上时,这些事件被触发。与 enter 和 leave 事件不同,hover 事件需要控件启用 mouseTracking 属性才能工作。这些事件可以用来实现鼠标悬停时的动态效果。

要处理这些鼠标事件,你需要在你的Qt控件类中重写相应的事件处理函数。例如:

void MyWidget::mousePressEvent(QMouseEvent *event) {
// 处理鼠标按下事件
// …
QWidget::mousePressEvent(event); // 调用基类的事件处理函数
}
在处理鼠标事件时,你可以获取鼠标的位置、按钮状态等信息,并通过这些信息来执行相应的逻辑。此外,Qt还提供了一些辅助方法,如 QMouseEvent->button() 获取被按下的鼠标按钮,QMouseEvent->buttons() 获取当前被按下的所有鼠标按钮,QMouseEvent->pos() 获取鼠标在控件内的相对位置等。

2.拖拽事件

在Qt中,拖拽事件是用户通过鼠标拖动来移动或传递数据的一种交互方式。Qt提供了几个事件和方法来处理拖拽操作,这些事件可以在QWidget及其子类的事件处理函数中被重写以实现自定义的拖拽行为。

以下是Qt中处理拖拽事件的关键方法和信号:

dragEnterEvent(QDragEnterEvent *event): 当拖拽操作进入控件时触发。这是检查拖拽数据类型并决定是否接受拖拽操作的地方。如果接受,可以调用event->acceptProposedAction()。

dragMoveEvent(QDragMoveEvent *event): 当鼠标在控件内拖动时连续触发。这个方法可以用来更新拖拽的视觉反馈或执行其他与拖拽相关的操作。

dragLeaveEvent(QDragLeaveEvent *event): 当拖拽操作离开控件时触发。这可以用来清理拖拽过程中创建的任何临时资源。

dropEvent(QDropEvent *event): 当拖拽操作完成并且数据被放置在控件上时触发。这个方法可以用来处理接收到的数据。

QDrag 类: 用于创建和操作拖拽数据。你可以通过QDrag对象来设置拖拽的源数据和拖拽时显示的图标。

QMimeData 类: 用于表示拖拽操作中传输的数据。QMimeData可以存储多种格式的数据,如文本、图像、URL等。

需要注意的是,要使拖放操作正常工作,还需要正确设置控件的拖放属性和事件过滤器,并实现其他相关的拖放事件函数,例如 dragMoveEvent、dropEvent 等。

MImeData:

mimeData 是 Qt 中的一个概念,用于在拖放操作中传递数据。它是 QDrag、QDragEnterEvent、QDragMoveEvent 和 QDropEvent 等拖放相关类中的一个成员函数,用于获取拖放事件中的数据。

具体来说,mimeData 是一个用于存储拖放操作数据的对象,它使用 MIME(Multipurpose Internet Mail Extensions)类型来表示数据的格式和内容。MIME 数据可以包含多种类型的数据,例如文本、图像、URL 等。

在拖放操作中,拖动源会将数据放入 mimeData 对象中,并将该对象传递给目标控件或事件。目标控件或事件可以通过访问 mimeData 对象来获取拖放操作所携带的数据,并进行相应的处理。


对拖拽操作进行自定义的话可以重写下面几个函数

QStringList mimeTypes() const;
    QMimeData* mimeData(const QModelIndexList& listModelIndex) const;
    bool dropMimeData(const QMimeData* pMimeData, Qt::DropAction action, int nRow, int nColumn, const QModelIndex& modelIndex);
    Qt::DropActions supportedDropActions() const;
    Qt::ItemFlags   flags(const QModelIndex& index) const;

拖动含有中文的txt有乱码,怎么才能搞定呢

content = QString::fromLocal8Bit( file.readAll());

获取一个目录下的文件总数

void CCopyThread::filesRecursiveCounter(QString path,int &counter)
{
    QFileInfo info(path);
​
    //·��������
    if(!info.exists())
    {
        return;
    }
​
    //�������ļ�counter+1
    if(info.isFile())
    {
        counter++;
        return;
    }
​
    QDir dir(path);
​
    //�ļ���
    dir.setFilter(QDir::NoDotAndDotDot|QDir::Hidden|QDir::Files|QDir::Dirs);
​
    QFileInfoList fileInfoList = dir.entryInfoList();
    foreach(QFileInfo fileInfo, fileInfoList)
    {
        QString tmpPath = fileInfo.absoluteFilePath();
        filesRecursiveCounter(tmpPath,counter);
    }
}

在Qt中,QMimeData 类用于在拖放操作中传递数据。数据以 MIME 类型的形式存储在 QMimeData 对象中,可以使用 setData() 方法设置数据,也可以使用 data() 方法获取数据。

在这个代码片段中,data() 方法用于从 pMimeData 中获取名为 “internal/drag” 的数据。如果该数据存在,并且已经以字节数组的形式设置,那么它将被存储在 byteArray 中。如果数据不存在或者不是字节数组类型,那么 byteArray 将保持为空。

根据上下文,“internal/drag” 是一个自定义的 MIME 类型,用于标识特定的数据。您可能需要在代码中搜索其他相关的部分,以了解如何使用这个数据以及它在拖放操作中的具体作用。

3.QSlider

qt中的滑块

继承的信号

valueChanged():当滑块的值发生了改变,发射此信号。tracking()确定在用户交互时,是否发出此信号。
sliderPressed():当用户按下滑块,发射此信号。
sliderMoved():当用户拖动滑块,发射此信号。
sliderReleased():当用户释放滑块,发射此信号。
paintEvent() 是 QWidget 类中的一个事件处理函数,用于绘制小部件的内容。当小部件需要进行绘制时,paintEvent() 函数会被自动调用。

以下是一些触发 paintEvent() 被调用的常见情况:

初始化:当小部件首次显示或需要重新绘制时,会触发 paintEvent() 被调用。这通常发生在小部件被添加到父窗口或显示窗口时。

更新请求:通过调用 update() 或 repaint() 函数,可以请求小部件进行重绘。这将导致 paintEvent() 被调用,以更新小部件的外观。

大小变化:当小部件的大小发生变化时,例如窗口大小调整或布局更改,会触发 paintEvent() 被调用,以便根据新的大小重新绘制小部件。

部分遮挡:当小部件的一部分被其他小部件遮挡或显示状态发生变化时,会触发 paintEvent() 被调用。这将使小部件能够更新被遮挡的区域。

可以用paintevent来重绘事件

void ToolSlider::paintEvent(QPaintEvent* event)
{
    //调用基类的进行正常绘制
    QSlider::paintEvent(event);
​
    //检查是否需要绘制半透明窗口
    if(!m_isHover && !m_isDragging )
    {
​
//        // 获取滑块当前的位置和大小   根据滑块位置显示
//        QStyleOptionSlider opt;
//        this->initStyleOption(&opt);
//        QRect sliderRect = this->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
//
//        // 获取并计算文本区域的位置和大小
//        double num = this->value() / 10;
//        num += (double)(this->value() % 10) / 10;
//        QString text = QString::number(num);
//
//        QFont font = this->font();
//        QFontMetrics fm(font);
//        QRect textRect(sliderRect.left() - 10, sliderRect.top(), fm.width(text) + 20 , fm.height() + 4);
//        qDebug() << "num " << num;
​
        //根据中间位置显示
//        QRect sliderRect = this->geometry();
​
        // 获取并计算文本区域的位置和大小
        double num = this->value() / 10;
        num += (double)(this->value() % 10) / 10;
        QString text = QString::number(num, 'f', 1);
​
        QFont font = this->font();
        QFontMetrics fm(font);
        int textWidth = fm.horizontalAdvance(text);
        int textHeight = fm.height();
        QRect textRect(this->width() / 2 - textWidth / 2 , 0, fm.width(text) + 2  , fm.height());
        qDebug() << "num " << num;
​
​
​
        // 创建一个QPainter对象用于绘制
        QPainter painter(this);
        painter.setPen(Qt::color1); // 设置文本颜色
        painter.setFont(font); // 设置字体
​
        //设置透明度
        painter.setOpacity(0.5);
        // 绘制文本区域的背景,使其缩小并紧贴滑块
        painter.fillRect(textRect, QColor(135, 206, 235)); // 用背景颜色填充文本区域
​
        // 在文本区域中绘制文本
        painter.drawText(textRect.adjusted(3, 1, -1, -1), Qt::AlignCenter, text);
​
    }
​
}

当事件发生时可以通过update 函数 来重新触发paint事件

QFontMetrics 是 Qt 框架中的一个类,它提供了关于特定字体的度量信息。使用 QFontMetrics 类,开发者可以获取与字体相关的各种度量标准,例如每个字符的宽度、高度、行间距、默认字体的字体度量等。这些信息对于文本布局、对齐和碰撞检测等任务非常重要。

创建 QFontMetrics 对象时,需要提供一个 QFont 对象,它表示你想要获取度量信息的字体。一旦有了 QFontMetrics 对象,你就可以查询各种度量属性,例如:

ascent(): 字体的上升高度(基线到字体顶部的距离)。

descent(): 字体的下降高度(基线到字体底部的距离)。

height(): 字体的高度(包括上升和下降)。

leading(): 字行之间的距离。

averageCharWidth(): 字体中字符的平均宽度。

maxCharWidth(): 字体中可能的最大字符宽度。

minLeftBearing(): 字符左边缘可能的最小偏移量。

minRightBearing(): 字符右边缘可能的最小偏移量。

inFont(): 检查一个 Unicode 字符是否在字体中定义。

textWidth(): 计算并返回给定文本字符串的宽度。

QFontMetrics 类通常用于确定文本在界面中的布局方式,以便文本能够正确地显示和对齐。例如,你可以使用 textWidth() 方法来确定文本字符串在给定字体下占据的宽度,从而在界面上为文本分配适当的空间。通过使用 QFontMetrics,开发者可以创建出更加精细和专业的用户界面。

4.其它

QModelIndex 对象包含以下几个主要成员函数:

isValid(): 判断当前索引是否有效。如果索引有效,则返回 true;否则返回 false`。

row(): 返回当前索引所在的行号。

column(): 返回当前索引所在的列号。

internalPointer(): 返回一个 void* 指针,它可以用于存储与索引相关的内部数据。它可以用于在自定义模型中存储额外的数据。

model(): 返回与当前索引相关联的模型对象的指针,通常是 QAbstractItemModel 或其派生类的指针。

QModelIndex 类的实例通常是通过模型类提供的函数获得的,例如 QAbstractItemModel 的 index() 函数。索引可以用于访问模型中的数据、设置数据、获取父子关系等操作。

关于 qreal,它是 Qt 框架中定义的一个类型,用于表示浮点数。它实际上是 typedef 为 double 的别名,用于提供平台无关的浮点数精度。因此,qreal 可以视为 double 类型的同义词。在 Qt 中,经常使用 qreal 类型来保持跨平台的一致性和可移植性。

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值