【问题标题】:QTreeWidget childAt(int x, int y) returns NULLQTreeWidget childAt(int x, int y) 返回 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() 失败了。

【问题讨论】:

标签: c++ qt


【解决方案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()。
猜你喜欢
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 2014-11-09
相关资源
最近更新 更多