[英]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.