Qt使用QListWidget實現(xiàn)自定義Item
主界面UI
操作流程:
主窗口中央控件是QListWidget,點擊添加按鈕,會隨機向主窗口中央控件中添加自定義item;
選中某條前的可選框,如果選中,點擊右側(cè)的刪除圖標,會彈出提示是否刪除;如果不選中,右側(cè)刪除圖標無法點擊;
點擊是,刪除當前item,點擊否,不刪除。
實現(xiàn)需解決問題
1:如何在QListWidget中添加帶有按鈕、文本等其它控件的項?
2:選中某項后如何響應?QListWidget自帶的item響應為什么不生效?
3:如何選中刪除按鈕后,通知QListWidget做出刪除當前item的操作?
示例
首先是主窗口代碼
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: // 添加項 void on_btn_add_clicked(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <custemitem.h> #include <QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_btn_add_clicked() { QListWidgetItem* pItem = new QListWidgetItem(""); ui->listWidget->addItem(pItem); custemItem* pCustomItem = new custemItem(pItem); ui->listWidget->setItemWidget(pItem, pCustomItem); ui->listWidget->setCurrentItem(pItem); connect(pCustomItem, &custemItem::emit_del, this, [&](QListWidgetItem* pItem){ QMessageBox::StandardButton btn = QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("是否刪除?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if(QMessageBox::No == btn) return; ui->listWidget->removeItemWidget(pItem); delete pItem; pItem = nullptr; }); }
其次是自定義QWidget控件代碼
customitem.h
#ifndef CUSTEMITEM_H #define CUSTEMITEM_H #include <QWidget> #include <QListWidgetItem> namespace Ui { class custemItem; } class custemItem : public QWidget { Q_OBJECT public: explicit custemItem(QListWidgetItem* pItem, QWidget *parent = nullptr); ~custemItem(); signals: void emit_del(QListWidgetItem* pItem); private slots: void on_pushButton_clicked(); private: Ui::custemItem *ui; QListWidgetItem* m_pItem; }; #endif // CUSTEMITEM_H
customitem.cpp
#include "custemitem.h" #include "ui_custemitem.h" #include "defind.h" custemItem::custemItem(QListWidgetItem* pItem, QWidget *parent) : QWidget(parent), ui(new Ui::custemItem), m_pItem(pItem) { ui->setupUi(this); ui->pushButton->setEnabled(false); int nRand = qrand()%4; ui->checkBox->setText(slText.at(nRand)); ui->checkBox->setIcon(QIcon(slIcon.at(nRand))); connect(ui->checkBox, &QCheckBox::clicked, this, [=](){ ui->pushButton->setEnabled(ui->checkBox->isChecked()); }); } custemItem::~custemItem() { delete ui; } void custemItem::on_pushButton_clicked() { if(ui->checkBox->isChecked()) { emit emit_del(m_pItem); }else{ } }
增加一個隨機顯示圖標和文本的類
defind.h
#ifndef DEFIND_H #define DEFIND_H #include <QStringList> #include <QList> #include <QIcon> QStringList slText = {"12312312.mp3", "dfdafds.mp4", "zcvzcvzxv.txt", "asdfasdfafsafdf.avi"}; QList<QString> slIcon = {":/res/mp3.png", ":/res/mp4.png", ":/res/TXT.png", ":/res/Video.png"}; #endif // DEFIND_H
最后是main代碼
main.cpp
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
到此這篇關(guān)于Qt使用QListWidget實現(xiàn)自定義Item的文章就介紹到這了,更多相關(guān)Qt QListWidget自定義Item內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章

Linux系統(tǒng)下C語言中的標準IO總結(jié)

C++實現(xiàn)LeetCode(48.旋轉(zhuǎn)圖像)

C++中一維數(shù)組與指針的關(guān)系詳細總結(jié)

Linux中使用C語言實現(xiàn)基于UDP協(xié)議的Socket通信示例

C語言實現(xiàn)經(jīng)典小游戲井字棋的示例代碼