如何使用qt实现QCombox 填充样式下拉列表,要求选择后当前item显示填充名称和填充图案,图案在前,文字在后,请用c++实现
时间: 2024-03-27 10:40:16 浏览: 98
首先,需要在Qt的工程中添加一个QComboBox控件。然后,在需要的地方添加以下代码:
```cpp
// 创建ComboBox的Model
QStandardItemModel *model = new QStandardItemModel();
// 添加ComboBox的Item
QStandardItem *item1 = new QStandardItem(QIcon(":/images/image1.png"), "Item 1");
QStandardItem *item2 = new QStandardItem(QIcon(":/images/image2.png"), "Item 2");
model->appendRow(item1);
model->appendRow(item2);
// 将Model设置给ComboBox
ui->comboBox->setModel(model);
// 设置ComboBox的Delegate,用于显示图标和文本
ui->comboBox->setItemDelegate(new QStyledItemDelegate(ui->comboBox));
ui->comboBox->view()->setItemDelegate(new QStyledItemDelegate(ui->comboBox));
// 设置ComboBox的样式
ui->comboBox->setStyleSheet("QComboBox::item { padding: 5px; } QComboBox::item:selected { background-color: #e5e5e5; }");
// 设置ComboBox的宽度和高度
ui->comboBox->setFixedSize(150, 30);
```
其中,QStandardItemModel用于管理ComboBox的Item,QStandardItem是每个Item的数据结构,QIcon是每个Item的图标,"Item 1"和"Item 2"是每个Item的文本,setModel用于将Model设置给ComboBox,setItemDelegate用于设置Delegate,setItemDelegate用于设置下拉列表的Delegate,setStyleSheet用于设置ComboBox的样式,setFixedSize用于设置ComboBox的大小。
在Delegate中,需要重写paint()函数,用于绘制每个Item的图标和文本。以下是Delegate的代码:
```cpp
class ComboBoxDelegate : public QStyledItemDelegate
{
public:
ComboBoxDelegate(QObject *parent = nullptr)
: QStyledItemDelegate(parent)
{
}
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
// 获取Item的数据
QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
QString text = index.data(Qt::DisplayRole).toString();
// 绘制Item的图标和文本
QRect iconRect = option.rect.adjusted(5, 0, -option.rect.width() / 2, 0);
QRect textRect = option.rect.adjusted(option.rect.width() / 2, 0, -5, 0);
painter->drawPixmap(iconRect, icon.pixmap(16, 16));
painter->drawText(textRect, Qt::AlignVCenter | Qt::AlignLeft, text);
}
};
```
最后,需要在ComboBox的currentIndexChanged()信号中,更新当前Item的图标和文本。以下是代码:
```cpp
void MainWindow::on_comboBox_currentIndexChanged(int index)
{
QIcon icon = qvariant_cast<QIcon>(ui->comboBox->model()->data(ui->comboBox->model()->index(index, 0), Qt::DecorationRole));
QString text = ui->comboBox->currentText();
ui->label->setText(text);
ui->label->setPixmap(icon.pixmap(32, 32));
}
```
其中,label用于显示当前Item的图标和文本。
这样,就可以实现一个QComboBox填充样式下拉列表,并且选择后当前item显示填充名称和填充图案,图案在前,文字在后的效果。
阅读全文