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

时间:2013-11-29 07:40:18

标签: c++ qt

我试图将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-&gt; winId(),&amp; p))并将px和py传递给childAt()以及event.pos.x()和event.pos.y( )。我真的很困惑。

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

我甚至在x和y处显示工具提示并且它们是有效的,但是,childAt()失败。

1 个答案:

答案 0 :(得分:4)

问题是你在屏幕坐标中使用&#34;鼠标光标的位置。&#34;,但它需要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()