Qt中,使用Qlistwidget实现数据有三列,第一列为复选框,第二列为 IP地址,第三列为端口。要求在外部点击按钮可以实现全选和全不选的功能,并且实现当前复选了哪些项
时间: 2023-07-16 20:15:24 浏览: 121
QTableWidget表头添加复选框实现全选功能
3星 · 编辑精心推荐
可以通过以下步骤实现:
1. 在 QListWidget 中添加 QListWidgetItem,每个 item 包含三个控件:QCheckBox、QLabel 和 QLabel,分别用于显示复选框、IP地址和端口。
2. 为 QListWidget 设置 QAbstractItemDelegate,重写 paint() 方法,使得每个 item 显示为三列。
3. 为“全选”和“全不选”按钮分别绑定槽函数,当点击按钮时,遍历 QListWidget 中的所有 item,将复选框设置为选中或不选中。
4. 当复选框状态发生改变时,遍历 QListWidget 中的所有 item,记录下哪些项被选中了。
下面是具体的实现代码:
```cpp
// 添加 item
QListWidgetItem* item = new QListWidgetItem(ui->listWidget);
ui->listWidget->addItem(item);
QCheckBox* checkBox = new QCheckBox();
QLabel* ipLabel = new QLabel(ip);
QLabel* portLabel = new QLabel(port);
QWidget* widget = new QWidget();
QHBoxLayout* layout = new QHBoxLayout(widget);
layout->addWidget(checkBox);
layout->addWidget(ipLabel);
layout->addWidget(portLabel);
layout->setContentsMargins(0, 0, 0, 0);
item->setSizeHint(widget->sizeHint());
ui->listWidget->setItemWidget(item, widget);
// 设置 QAbstractItemDelegate
class ItemDelegate : public QStyledItemDelegate {
public:
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override {
Q_ASSERT(index.isValid());
QWidget* widget = qobject_cast<QWidget*>(index.data(Qt::UserRole + 1).value<void*>());
Q_ASSERT(widget);
const QPalette& pal = option.palette;
QStyleOptionViewItem opt = option;
initStyleOption(&opt, index);
// 画背景
painter->fillRect(opt.rect, pal.color(QPalette::Base));
// 画控件
opt.widget = widget;
style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);
}
};
ui->listWidget->setItemDelegate(new ItemDelegate());
// 全选和全不选
void MainWindow::selectAll() {
for (int i = 0; i < ui->listWidget->count(); ++i) {
QListWidgetItem* item = ui->listWidget->item(i);
QCheckBox* checkBox = qobject_cast<QCheckBox*>(ui->listWidget->itemWidget(item)->children().at(0));
checkBox->setChecked(true);
}
updateCheckedItems();
}
void MainWindow::deselectAll() {
for (int i = 0; i < ui->listWidget->count(); ++i) {
QListWidgetItem* item = ui->listWidget->item(i);
QCheckBox* checkBox = qobject_cast<QCheckBox*>(ui->listWidget->itemWidget(item)->children().at(0));
checkBox->setChecked(false);
}
updateCheckedItems();
}
// 更新选中项
void MainWindow::updateCheckedItems() {
QStringList checkedItems;
for (int i = 0; i < ui->listWidget->count(); ++i) {
QListWidgetItem* item = ui->listWidget->item(i);
QCheckBox* checkBox = qobject_cast<QCheckBox*>(ui->listWidget->itemWidget(item)->children().at(0));
if (checkBox->isChecked()) {
QLabel* ipLabel = qobject_cast<QLabel*>(ui->listWidget->itemWidget(item)->children().at(1));
QLabel* portLabel = qobject_cast<QLabel*>(ui->listWidget->itemWidget(item)->children().at(2));
checkedItems << ipLabel->text() + ":" + portLabel->text();
}
}
qDebug() << checkedItems;
}
```
阅读全文