【问题标题】:Child widget mouse event子部件鼠标事件
【发布时间】:2012-03-25 00:18:55
【问题描述】:

我有一个简单的 Qt 应用程序,它有一个主窗口和一个继承 QTreeWidget 的类 (TreeView)。

我似乎无法为 treewidget 启用鼠标事件。带有工具栏和菜单栏的主窗口工作正常,但我无法单击 treeWidget 中的任何项目。

我已经在我的课程中包含了 QMouseEvent 并实现了虚拟功能。下面是一个例子:

void TreeView::itemDoubleClicked(QTreeWidgetItem *item, int column)
{
    QMessageBox::information(this, "Message", item->text(column));
}

我在这里遗漏了什么明显的东西吗?

编辑: 我的 TreeView.h:

#include <vector>
#include <algorithm>
#include <QTreeWidget>
#include <QMouseEvent>

//ObjectCube includes
#include <Hub.h>
#include <TagSet/TagSet.h>
#include <Tag/Tag.h>

#include "tagsettree.h"
#include "tagtree.h"

using namespace ObjectCube;

class TreeView: public QTreeWidget
{
    Q_OBJECT
public:
    TreeView(QWidget *parent);    
    void buildTree(Hub *hub);
    void buildEachTagSetTree(TagSetTree *parent);
    void addHierarchiesToTree(QTreeWidgetItem *parent, TagSet *tagSet);

    void itemDoubleClicked (QTreeWidgetItem *item, int column);
};

构造函数:

TreeView::TreeView(QWidget *parent): QTreeWidget(parent)
{
    this->setHeaderLabel("Images");
    this->setEnabled(true);
}

编辑:

我已经解决了@webclectic 指出的问题,但并没有解决问题。

是否有可能我已经阻止了 treeWidget 中的所有 mouseEvents? 我可以用键盘遍历它们,但鼠标不起作用。

编辑:

我有一个主窗口。该主窗口有一个指向控制器类的指针。控制器类拥有主窗口中使用的所有小部件的实例,包括 TreeWidget。主窗口是控制器的父窗口以及其中的所有小部件。代码:

//Constructor
MainController::MainController(QWidget *parent, Hub *hub): QWidget(parent)
{
    this->hub = hub;
    initializeController(parent);
}

void MainController::initializeController(QWidget *main)
{
    treeView = new TreeView(main);
    glWidget = new GLWidget(main);
    listWidget = new ListWidget(main);

    rightSide = new QVBoxLayout(main);

    treeView->buildTree(hub);

    treeView->move(0, 55);
    treeView->resize(main->frameGeometry().width() * 0.2, main->frameGeometry().height() *0.91);

    glWidget->move(main->frameGeometry().width() * 0.32 ,55);
    glWidget->resize(main->frameGeometry().width() * 0.67, main->frameGeometry().height() *0.91);

    rightSide->addWidget(listWidget);
    rightSide->setGeometry(QRect(QPoint(main->geometry().width() -20 , 55), QPoint(main->geometry().width(),main->geometry().height())));

}

吉斯利

【问题讨论】:

  • 你能提供更多细节吗....
  • @shobi 添加了我的 .h 文件和构造函数
  • 你见过webclectic的答案吗,试试看……
  • 如果您添加 QTreeWidget 而不是您的班级会怎样?您还可以重新实现 mousePressEvent() 或 mouseDoubleClickEvent() 并在其中添加 qDebug 消息以查看发生了什么。尝试创建一个问题仍然存在的最小示例,您会发现问题出在哪里......
  • 另外,告诉您如何将小部件添加到主窗口可能会很有趣。

标签: qt


【解决方案1】:

itemDoubleClicked 是一个信号而不是一个槽。您需要做的是将其与插槽连接,您将在其中拥有自定义代码。

在主窗口的构造函数中

// pTreeView is a pointer to the TreeView widget
connect(pTreeView, SIGNAL(itemDoubleClicked ( QTreeWidgetItem *, int),
        this,      SLOT(mySlot(QTreeWidgetItem*, int)));

然后在你的位置:

void TreeView::mySlot(QTreeWidgetItem *item, int column)
{
    QMessageBox::information(this, "Message", item->text(column));
}

【讨论】:

  • 谢谢。不过,这并没有奏效。仍然无法单击小部件中的任何项目。
【解决方案2】:

所以我终于找到了答案,这是一个愚蠢的错误。在主窗口构造函数中,我先创建了小部件的实例:

ui->setupUi(this);

所以我把这条线移到构造函数的顶部,一切正常。这可能是 Qt 中的基本内容,但由于某种原因我错过了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 2011-08-05
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多