在Qt中,可以使用QListWidget或QTreeWidget来创建列表或树形视图。在每个列表项或树节点中添加控件可以通过重写QListWidgetItem或QTreeWidgetItem的paint()函数实现。
以下是一个示例,演示如何在QListWidget中的每个项中添加一个QPushButton:
class ListWidgetItem : public QListWidgetItem
{
public:
ListWidgetItem(const QString &text, QListWidget *parent = nullptr)
: QListWidgetItem(text, parent)
{
QPushButton *button = new QPushButton("Button");
setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
setSizeHint(button->sizeHint() + QSize(0, 10)); // 设置项的大小为按钮大小加上一些空白
listWidget()->setItemWidget(this, button); // 将按钮作为项的控件
}
protected:
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
// 绘制项的背景和文本
painter->fillRect(option.rect, option.state.testFlag(QStyle::State_Selected) ? option.palette.highlight() : option.palette.base());
painter->drawText(option.rect, text());
}
};
然后,在列表中添加项时,直接创建ListWidgetItem即可:
QListWidget *listWidget = new QListWidget(this);
for (int i = 0; i < 10; i++) {
new ListWidgetItem(QString("Item %1").arg(i), listWidget);
}
setCentralWidget(listWidget);
这样就可以在每个列表项中添加一个按钮了。类似地,也可以使用QTreeWidgetItem来实现在每个树节点中添加控件。