躺平艺术家 2024-04-03 00:00 采纳率: 100%
浏览 16
已结题

qt的textedit捕捉不到鼠标左键

qt的textedit检测不到鼠标左键的点击

void MainWindow::mousePressEvent(QMouseEvent *event) {
    // 获取点击事件的目标对象
    QObject *target = qApp->widgetAt(event->globalPos());
    if (target == imageLabel) { // 图片容器
        // 将全局位置转换为容器内的相对位置
        if (imageLabel->pixmap() == nullptr) {
              qDebug() << "Pixmap is null!";
              return;
        }
        QPoint localPos = imageLabel->mapFromGlobal(event->globalPos());
        // 获取像素的行列号
        int x = localPos.x();
        int y = localPos.y();
        QPixmap pixmap = imageLabel->pixmap()->copy(); // 复制图像以避免原始图像被修改
        QRgb pixelValue = pixmap.toImage().pixel(localPos);
        int red = qRed(pixelValue);
        int green = qGreen(pixelValue);
        int blue = qBlue(pixelValue);
        QString pixelStr = QString("行 %1 列 %2,RGB值:R:%3 G:%4 B:%5\n").arg(y).arg(x).arg(red).arg(green).arg(blue);
        ui->textEdit->append(pixelStr);

    } else if (target==textedit) { // 检查点击事件的位置是否在 textedit 区域内
        // 将全局位置转换为容器内的相对位置
        QPoint localPos = textedit->mapFromGlobal(event->globalPos());
        // 获取点击位置的光标
        QTextCursor cursor = textedit->cursorForPosition(localPos);
        // 获取当前字
        cursor.movePosition(QTextCursor::StartOfWord); // 将光标移动到当前字的开头
        cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); // 选择当前字
        QString currentWord = cursor.selectedText();
        qDebug() << "当前字:" << currentWord;
    }else {
        qDebug() << "点击了其他地方。";
    }
}

  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-04-03 02:58
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    根据你的描述,问题似乎在于Qt的TextEdit无法捕捉到鼠标左键的点击事件。你的解决思路是在 mousePressEvent
    函数中通过检查点击事件的目标对象来处理点击事件,但可能存在一些问题。以下是我对问题的分析和解决方案:

    1. 目标对象的判断不准确 :在你的代码中,目标对象的判断是通过比较对象指针来实现的,这种方法并不可靠。应该考虑使用更可靠的方法来判断点击事件的目标对象。
    2. TextEdit无法捕捉鼠标事件 :TextEdit控件默认情况下是不会捕捉鼠标事件的,需要通过继承TextEdit并重写 mousePressEvent 函数来实现鼠标事件的捕捉。
      基于以上分析,我建议你按照以下步骤来修改代码:
      首先,在MainWindow类中添加一个新的TextEdit子类,并重写其mousePressEvent函数来捕捉鼠标事件:
      cppCopy code
      class MyTextEdit : public QTextEdit {
      Q_OBJECT
      public:
      MyTextEdit(QWidget *parent = nullptr) : QTextEdit(parent) {}
      protected:
      void mousePressEvent(QMouseEvent *event) override {
      if (event->button() == Qt::LeftButton) {
      qDebug() << "Left button clicked on TextEdit!";
      // 在这里处理鼠标左键点击事件
      }
      QTextEdit::mousePressEvent(event);
      }
      };
      
      然后,在MainWindow类的构造函数中创建一个MyTextEdit对象,并将其设置为CentralWidget,替代原来的ui->textEdit。
      最后,修改mousePressEvent函数,移除对TextEdit的判断,直接处理鼠标左键点击事件即可:
      cppCopy code
      void MainWindow::mousePressEvent(QMouseEvent *event) {
      if (event->button() == Qt::LeftButton) {
      qDebug() << "Left button clicked!";
      // 在这里处理鼠标左键点击事件
      } else {
      qDebug() << "Other button clicked!";
      }
      }
      
      通过以上修改,你应该可以捕捉到TextEdit控件的鼠标左键点击事件了。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月13日
  • 已采纳回答 4月5日
  • 创建了问题 4月3日

悬赏问题

  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 用大厂网站防红自己网站
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询
  • ¥20 我的是道格手机,重置后屏幕右上角出现红色字的未写入tee key 和未写入google key请问怎么去掉啊
  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码