我有一个容器类,它是treeItem类中的数据类型。
我的树结构工作正常,但是如何从所选项目中检索Container数据类型的值。
这就是我定义数据功能的方式。
就我在QT的树状视图示例中所了解的情况而言,我们在Data函数中返回的数据不能为对象,而应为具体值。
class Container
{
private:
std::string stdstrContainerName;
std::string stdstrPluginType;
public:
Container();
Container(std::string , std::string , int , float);
Container(const Container& obj);
~Container();
std::string GetName();
std::string GetType();
void SetName(std::string stdstrName);
};
Q_DECLARE_METATYPE( Container )
class TreeItem
{
public:
/* Other Functions of the class
*/
Container data() const;
bool setData(const Container &data);
private:
QList<TreeItem*> childItems;
Container itemData;
TreeItem* parentItem;
};
QVariant TreeModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role != Qt::DisplayRole && role != Qt::EditRole)
return QVariant();
TreeItem *item = getItem(index);
// i wanted to return data from here.
return QString::fromStdString(item->data().GetName()); // if i
//return Container as datatype or return Container as QVariant than
//the tree structure does not work.
// It only works if i have a concrete value rather that a object.
}
// data function of TreeItem
Container TreeItem::data() const
{
return itemData;
}
答案 0 :(得分:1)
我在TreeModel中添加了一个新功能。
Container TreeModel::GetContainer(const QModelIndex &index)
{
TreeItem *item = getItem(index);
return (item->data());
}
比将AbstractModel强制转换为TreeModel。
void SumTreeProject::PrintData()
{
QModelIndex index = treeView->selectionModel()->currentIndex();
QAbstractItemModel *model = treeView->model();
TreeModel *myModel = qobject_cast<TreeModel*>( model);
Container cont = myModel->GetContainer(index);
qDebug() << cont.GetType().c_str(); // Able to print the value
}
答案 1 :(得分:1)
您提出的解决方案是实现这一目标的一种方法。
批评是它会将您的观点与模型紧密联系在一起。
另一方面,任何Qt模型都与其视图紧密相关,至少在列的解释,返回的数据类型或项目层次方面。
已经说了这一点,并且考虑到您只需要Semaphore sem;
bool createdSystemWideSem;
sem = new Semaphore(0, 1, "sem1", out createdSystemWideSem);
if (!createdSystemWideSem)
{
sem = Semaphore.OpenExisting("sem1");
}
数据,另一种做您想要做的方法是:
Container::GetType()
函数返回特定列的data(QModelIndex index, int role)
结果,例如Container::GetType()
。 (您已经描述过index.column()==1
指定了所需的index.row()
实例。)Container
方法需要通过调用SumTreeProject::PrintData()
从行QModelIndex
和列1中获得treeView->selectionModel()->currentIndex()
。treeView->model()->index(row, 1)
获取数据。此方法的优点是您无需在treeView->model()->data(index).toString()
代码中包含TreeModel.h
或Container.h
。