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的主要内容,如果未能解决你的问题,请参考以下文章