簡體   English   中英

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

[英]QTreeWidget childAt(int x, int y) returns NULL

我正在嘗試將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))並將px和py傳遞給childAt()以及event.pos.x()和event.pos.y()。 我真的很困惑。

我在日志中檢查了px和py,它們始終有效。

我什至在x和y處顯示工具提示,它們有效,但是childAt()失敗。

問題是您使用“鼠標光標的位置,以屏幕坐標為單位。”,但是它需要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()childAt()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM