qt上如果要实现像steam库里的游戏分类并可添加新组可分类游戏到其他组中用代码完全实现
在Qt中实现像Steam库里的游戏分类,可以使用QTreeView和QStandardItemModel来实现。
首先,需要创建一个QStandardItemModel对象,并设置其列数为1:
QStandardItemModel *model = new QStandardItemModel();
model->setColumnCount(1);
然后,可以添加根节点,并设置其文本为“库”:
QStandardItem *rootItem = model->invisibleRootItem();
rootItem->setText("库");
接下来,可以添加子节点,表示不同的游戏分类。例如,可以添加一个“动作游戏”节点:
QStandardItem *actionItem = new QStandardItem("动作游戏");
rootItem->appendRow(actionItem);
为了能够添加新组,可以在菜单中添加一个“添加组”选项。当用户选择该选项时,可以弹出一个对话框,让用户输入新组的名称。然后,可以创建一个新的QStandardItem节点,并将其添加到根节点下:
QString groupName = QInputDialog::getText(this, "添加组", "请输入新组名称:");
QStandardItem *newGroupItem = new QStandardItem(groupName);
rootItem->appendRow(newGroupItem);
为了能够将游戏分类到其他组中,可以为每个游戏节点添加一个自定义的数据项,表示该游戏所属的组。例如,可以创建一个名为“groupName”的数据项,并将其设置为游戏所属的组的名称:
QStandardItem *gameItem = new QStandardItem("游戏名称");
gameItem->setData("动作游戏", Qt::UserRole + 1);
actionItem->appendRow(gameItem);
最后,可以实现一个槽函数,处理当用户选择某个游戏节点时的操作。例如,可以在右侧显示该游戏的详细信息:
void onGameSelected(const QModelIndex &index)
{
if (index.isValid())
{
QString gameName = index.data(Qt::DisplayRole).toString();
QString groupName = index.data(Qt::UserRole + 1).toString();
// 在右侧显示游戏详细信息
}
}
完整的代码示例:
#include <QTreeView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QInputDialog>
class GameLibrary : public QWidget
{
public:
GameLibrary(QWidget *parent = nullptr) : QWidget(parent)
{
QStandardItemModel *model = new QStandardItemModel();
model->setColumnCount(1);
QStandardItem *rootItem = model->invisibleRootItem();
rootItem->setText("库");
QStandardItem *actionItem = new QStandardItem("动作游戏");
rootItem->appendRow(actionItem);
QStandardItem *gameItem = new QStandardItem("游戏名称");
gameItem->setData("动作游戏", Qt::UserRole + 1);
actionItem->appendRow(gameItem);
QTreeView *treeView = new QTreeView;
treeView->setModel(model);
connect(treeView, &QTreeView::clicked, this, &GameLibrary::onGameSelected);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(treeView);
QPushButton *addGroupButton = new QPushButton("添加组");
connect(addGroupButton, &QPushButton::clicked, this, &GameLibrary::onAddGroupClicked);
layout->addWidget(addGroupButton);
setLayout(layout);
}
private slots:
void onGameSelected(const QModelIndex &index)
{
if (index.isValid())
{
QString gameName = index.data(Qt::DisplayRole).toString();
QString groupName = index.data(Qt::UserRole + 1).toString();
// 在右侧显示游戏详细信息
}
}
void onAddGroupClicked()
{
QString groupName = QInputDialog::getText(this, "添加组", "请输入新组名称:");
QStandardItem *newGroupItem = new QStandardItem(groupName);
model()->invisibleRootItem()->appendRow(newGroupItem);
}
private:
QStandardItemModel *model() const
{
return static_cast<QStandardItemModel *>(static_cast<QTreeView *>(children().first())->model());
}
};
原文地址: http://www.cveoy.top/t/topic/bxSg 著作权归作者所有。请勿转载和采集!