QTreeWidget childAt(int x, int y) 返回 NULL

Posted

技术标签:

【中文标题】QTreeWidget childAt(int x, int y) 返回 NULL【英文标题】:QTreeWidget childAt(int x, int y) returns NULL 【发布时间】:2013-11-29 07:40:18 【问题描述】:

我试图在鼠标指针所在的位置获取 QTreeWidgetItem(节点)。 QTreeWidget 类有一个名为 childAt(int x, int y) 的方法,这里似乎没有记录:http://qt-project.org/doc/qt-5.1/qtwidgets/qtreewidget.html,我不知道为什么。背后可能是有原因的。该方法总是为我返回 NULL。

我已经扩展了 QTreeWidget 类,所以我可以捕获 mouseMoveEvent。

class CustomTreeWidget : public QTreeWidget 

  Q_OBJECT

  public:
      explicit CustomTreeWidget(QWidget *parent = 0);

  signals:
      void OnMouseMove(int x, int y);

  public slots:

  private:
      void mouseMoveEvent(QMouseEvent *event);

 ;

然后在我的主 cpp 文件中:

void CustomTreeWidget::mouseMoveEvent(QMouseEvent *event)

    QTreeWidget::mouseMoveEvent(event);

    POINT p;
    if (GetCursorPos(&p))
    
       qDebug(QString("GetCursorPos() OK: X=" + QString::number(p.x) + " Y=" + QString::number(p.y)).toLocal8Bit().data());

       QTreeWidgetItem *item = dynamic_cast<QTreeWidgetItem *> (this->childAt(p.x, p.y));

       if (item == NULL) return;

       qDebug(item->text(0).toLocal8Bit().data());
    

    emit OnMouseMove(p.x, p.y);

然后在我的 MainWindow 文件中:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)


   ui->setupUi(this);

   XTreeWidget *treeWidget = new XTreeWidget(this);

   QTreeWidgetItem *rootItem = new QTreeWidgetItem(treeWidget, QTreeWidgetItem::UserType);
   rootItem->setText(0, "Item 1");
   treeWidget->addTopLevelItem(rootItem);

   rootItem = new QTreeWidgetItem(treeWidget, QTreeWidgetItem::UserType);
   rootItem->setText(0, "Item 2");
   treeWidget->addTopLevelItem(rootItem);

   this->setCentralWidget(treeWidget);

我运行代码,但以下语句从未运行:

qDebug(item->text(0).toLocal8Bit().data());

所以在CustomTreeWidget类的mouseMoveEvent中,下面的语句返回true,方法返回:

if (item == NULL) return;

我做错了什么? dynamic_cast 失败。

我还尝试了 ScreenToClient((HWND)this->winId(), &p)) 并将 p.x 和 p.y 传递给 childAt() 以及 event.pos.x() 和 event.pos.y()。我真的很困惑。

我在日志中检查了我的 p.x 和 p.y,它们始终有效。

我什至在 x 和 y 处显示了一个工具提示,它们是有效的,但是 childAt() 失败了。

【问题讨论】:

childAt()QWidget的成员,所以查看QWidget页面的文档;此外,该线程似乎与您的问题非常相似:qt-project.org/forums/viewthread/12717;有帮助吗? 【参考方案1】:

问题是您使用“鼠标光标的位置,在屏幕坐标中。”,但它需要 QTreeWidget 坐标系中的坐标。因此,我建议放弃使用 WinAPI 并改用 QMouseEvent::pos() 函数。您的 mouseMoveEvent 将如下所示:

void CustomTreeWidget::mouseMoveEvent(QMouseEvent *event)

    QTreeWidget::mouseMoveEvent(event);    
    QTreeWidgetItem *item = itemAt(event->pos();    
    if (item != NULL)
        qDebug(item->text(0).toLocal8Bit().data());

请注意QTableWidget::itemAt()函数的用法,而不是childAt()

【讨论】:

我已经尝试过了:this->childAt(event->pos().x(), event->pos().y()) 但没有任何区别。相信我,这是我累的第一件事(是的,我确实将 mouseTracking 设置为 true) @rwx,请注意,我建议使用 QTableWidget::itemAt() 而不是 childAt()。

以上是关于QTreeWidget childAt(int x, int y) 返回 NULL的主要内容,如果未能解决你的问题,请参考以下文章

QTreeWidget 仅在顶层拖放

PyQt4 中的多列(可能使用 QTreeWidget)

在PyQt5中的QTreeWidget和QListWidget之间拖动项目?

设置 QtreeWidget 高度

向 QTreeWidget 添加一行

将外部文件放入 QTreeWidget