Qt继承QTreeWidgetItem的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt继承QTreeWidgetItem的问题相关的知识,希望对你有一定的参考价值。

头文件
#ifndefPUTREEWIDGETITEM_H#definePUTREEWIDGETITEM_H
#include<QTreeWidgetItem>
typedefenume_TreeItemTypeITEM_TYPE_NORMAL,ITEM_TYPE_SELF,ITEM_TYPE_RESTreeItemType;
classPuTreeWidgetItem:publicQTreeWidgetItemQ_OBJECTpublic:PuTreeWidgetItem(QWidget*parent);voidSetItemType(TreeItemTypetype);private:TreeItemTypem_type;;
#endif// PUTREEWIDGETITEM_H
cpp文件
#include"PuTreeWidgetItem.h"
PuTreeWidgetItem::PuTreeWidgetItem(QWidget*parent):QTreeWidgetItem(parent)m_type=ITEM_TYPE_NORMAL;
voidPuTreeWidgetItem::SetItemType(TreeItemTypetype)m_type=type;
编译出错:
E:\TC\Project\QT_Project\QClient\Client\PuTreeWidgetItem.cpp:4: 错误:call of overloaded 'QTreeWidgetItem(QWidget*&)' is ambiguous

如何解决呢?
我想达到的效果是创建一个PuTreeWidgetItem的时候跟QTreeWidgetItem用法一样
如:QTreeWidgetItem*pItemRes=newQTreeWidgetItem(parentItem);
C++学的不好,请高手指导一下
排版乱了,重写一下
#ifndef PUTREEWIDGETITEM_H
#define PUTREEWIDGETITEM_H
#include <QTreeWidgetItem>
typedef enum e_TreeItemType

ITEM_TYPE_NORMAL,
ITEM_TYPE_SELF,
ITEM_TYPE_RES
TreeItemType;
class PuTreeWidgetItem : public QTreeWidgetItem

Q_OBJECT
public:
PuTreeWidgetItem(QWidget *parent);
void SetItemType(TreeItemType type);
private:
TreeItemType m_type;
;
#endif // PUTREEWIDGETITEM_H

#include "PuTreeWidgetItem.h"
PuTreeWidgetItem::PuTreeWidgetItem(QWidget *parent) :
QTreeWidgetItem(parent)

m_type = ITEM_TYPE_NORMAL;

void PuTreeWidgetItem::SetItemType(TreeItemType type)

m_type = type;

参考技术A Q_OBJECT头文件中的这个宏定义去掉,Q_OBJECT这个宏意思是说会使用到Qt的信号和槽机制,但是QTreeWidgetItem根本就不具有信号和槽。 参考技术B 。。。

使用 QTreeWidgetItem 创建子树

【中文标题】使用 QTreeWidgetItem 创建子树【英文标题】:Creating subtree with QTreeWidgetItem 【发布时间】:2013-01-27 12:04:03 【问题描述】:

我正在尝试使用 QTreeWidgetItem 创建一个子树。 这是代码

m_pRoot = new QTreeWidgetItem(treeWidget);
m_pRoot->setText(0, "root");
m_pRoot->setData(0, Qt::UserRole, IT_ROOT);
createTreeItem(m_pRoot, m_pText,      "subtree_1",   IT_TEXT);
m_pRoot->setExpanded(true);
createTreeItem(m_pText, m_pPlainText, "subtree_2", IT_TEXT);

这就是方法:

void createTreeItem(PTR(QTreeWidgetItem) parent, PTR(QTreeWidgetItem) item, CREF(QString) name, ItemType itemType)

    item = new QTreeWidgetItem(parent);
    item->setText(0, name);
    item->setData(0, Qt::UserRole, QVariant(itemType));

当我用 m_pRoot 作为根项目创建“subtree_1”时没问题,但是当我想用 m_pText 作为根项目创建“subtree_2”时它会崩溃。

P.S PTR() 等于 *parent。

无法理解问题所在。有什么建议吗?

【问题讨论】:

【参考方案1】:

如果您的 PTR(QTreeQWidgetItem) 宏产生 QTreeWidgetItem*,则项目未由 createTreeItem 函数初始化。

最简单和最合乎逻辑的修复方法似乎是更改 createTreeItem 函数以返回新项目:

QTreeWidgetItem* createTreeItem(PTR(QTreeWidgetItem) parent, PTR(QTreeWidgetItem) item, 
    CREF(QString) name, ItemType itemType)

    item = new QTreeWidgetItem(parent);
    item->setText(0, name);
    item->setData(0, Qt::UserRole, QVariant(itemType));
    return item;

并使用返回值初始化m_pText。

【讨论】:

以上是关于Qt继承QTreeWidgetItem的问题的主要内容,如果未能解决你的问题,请参考以下文章

仅使 QTreeWidgetItem 的一列可编辑

使用 QTreeWidgetItem 创建子树

Qt: 创建具有复选框的树形控件

如何将 itemExpanded 与 QTreeWidgetItem 的子类一起使用

使用光标在QTreeWidgetItem中选择Text

qt中用树形结构作项目索引怎么实现各项目页面跳转