рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╕реНрд╡реАрд░
(рд╕рдВрднрд╡рддрдГ рдкреЛрд╕реНрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд)рдХрднреА-рдХрднреА, QComboBox рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдХрдИ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдпрд╣ рдЫреЛрдЯрд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред
рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ QComboBox рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ
Qt :: ItemIsUserCheckable рдЪреЗрдХ рдмреЙрдХреНрд╕ рдХреЛ рдЙрдард╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЙрдиреНрд╣реЗрдВ
рдзреНрд╡рдЬрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдпрд╣ рд╡рд┐рдЬреЗрдЯ рдкрд░ рдЪрд┐рд╣реНрдирд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХрд╛ рднреА рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛ред
рд╣рдо MultiListWidget рд╡рд░реНрдЧ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ (рд╕рдВрдкрддреНрддрд┐ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЬрд╛рдБрдЪ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗ, рдЙрди рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдерд╛ рдпрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдХрд▓реЗрдХреНрдЯрдЪрд┐рдЯрд┐рдбрд┐рдЯреНрд╕ рд╡рд┐рдзрд┐ рдиреЗ рдЪрд┐рд╣реНрдирд┐рдд рдореЙрдбрд▓ рддрддреНрд╡реЛрдВ рдХреЛ mCheckitItems рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рд╣реИ):
class MultiListWidget : public QComboBox { Q_OBJECT Q_PROPERTY(QStringList checkedItems READ checkedItems WRITE setCheckedItems) public: MultiListWidget(); virtual ~MultiListWidget(); QStringList checkedItems() const; void setCheckedItems(const QStringList &items); private: QStringList mCheckedItems; void collectCheckedItems(); };
QComboBox рдореЙрдбрд▓ рдореЗрдВ рдХрдИ рд╕рдВрдХреЗрдд рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╕рдореНрдорд┐рд▓рд┐рдд (const QModelIndex & parent, int start, int end) - рдореЙрдбрд▓ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ (AddItem, insertItem, рдЖрджрд┐ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ)
- рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ (const QModelIndex & parent, int start, int end) - рдЬрдм рдореЙрдбрд▓ рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ (рдХреЙрд▓ рд╣рдЯрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐)
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЖрдЗрдЯрдордЪреЗрдВрдЬ (QStandardItem * рдЖрдЗрдЯрдо), рдЬреЛ рдзреНрд╡рдЬ рд╕реЗрдЯ рдпрд╛ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдХ рд░реВрдк рд╕реЗ) рд╣реЛрдиреЗ рдкрд░ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдЗрди рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд▓реЙрдЯ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
private slots: void slotModelRowsInserted(const QModelIndex &parent, int start, int end); void slotModelRowsRemoved(const QModelIndex &parent, int start, int end); void slotModelItemChanged(QStandardItem *item);
рдФрд░ рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕реНрд▓реЙрдЯ рдХреЗ рд╕рд╛рде рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореЙрдбрд▓ () QAbstractItemModel рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрдЗрдЯрдордЪреЗрдВрдЬ рдХрд┐рдП рдЧрдП рд╕рд┐рдЧреНрдирд▓ рдХреЛ QStandardItemModel рдореЗрдВ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рдХрд╛рд╕реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ):
MultiListWidget::MultiListWidget() { connect(model(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(slotModelRowsInserted(QModelIndex,int,int))); connect(model(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(slotModelRowsRemoved(QModelIndex,int,int))); QStandardItemModel *standartModel = qobject_cast<QStandardItemModel*>(model()); connect(standartModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(slotModelItemChanged(QStandardItem*))); } MultiListWidget::~MultiListWidget() { }
рдЕрдм, рд╣рдо checkItems () рдФрд░ setCheckedItems (const QStringList рдФрд░ рдЖрдЗрдЯрдо) рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
QStringList MultiListWidget::checkedItems() const { return mCheckedItems; } void MultiListWidget::setCheckedItems(const QStringList &items) {
рд╕рдВрдЧреНрд░рд╣рд┐рдд рдирдореВрдиреЗ () рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рд╣рдо рдореЙрдбрд▓ рддрддреНрд╡реЛрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
void MultiListWidget::collectCheckedItems() { QStandardItemModel *standartModel = qobject_cast<QStandardItemModel*>(model()); mCheckedItems.clear(); for (int i = 0; i < count(); ++i) { QStandardItem *currentItem = standartModel->item(i); Qt::CheckState checkState = static_cast<Qt::CheckState>(currentItem->data(Qt::CheckStateRole).toInt()); if (checkState == Qt::Checked) { mCheckedItems.push_back(currentItem->text()); } } }
рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдирдпрд╛ рддрддреНрд╡ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдЪрд┐рд╣реНрдирд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╢реБрд░реВ рдореЗрдВ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд:
void MultiListWidget::slotModelRowsInserted(const QModelIndex &parent, int start, int end) {
рдореЙрдбрд▓ рд╕реЗ рдЖрдЗрдЯрдо рдирд┐рдХрд╛рд▓рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ mCheckedItems рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо collectCheckedItems () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
void MultiListWidget::slotModelRowsRemoved(const QModelIndex &parent, int start, int end) { (void)parent; (void)start; (void)end; collectCheckedItems(); }
рд╕реНрд▓реЙрдЯ рд╕реНрд▓реЙрдЯ рдореЗрдВрдореЙрдбрд▓рдИрдордЪреИрдирдбреЗрдЬ (QStandardItem * рдЖрдЗрдЯрдо), рд╣рдо рдЪрд┐рд╣реНрдирд┐рдд рддрддреНрд╡реЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ:
void MultiListWidget::slotModelItemChanged(QStandardItem *item) { (void)item; collectCheckedItems(); }
рд╣рдо рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХреНрд░рдорд╢рдГ, multilist.h рдФрд░ multilist.cpp рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ MultiListWidget рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ (рдлрд╝рд╛рдЗрд▓ main.cpp):
#include "multilist.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MultiListWidget *multiList = new MultiListWidget(); multiList->addItems(QStringList() << "One" << "Two" << "Three" << "Four"); multiList->setCheckedItems(QStringList() << "One" << "Three"); QHBoxLayout *layout = new QHBoxLayout(); layout->addWidget(new QLabel("Select items:")); layout->addWidget(multiList, 1); QWidget widget; widget.setWindowTitle("MultiList example"); widget.setLayout(layout); widget.show(); return app.exec(); }
рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдЬреЗрдЯ рдкрд░ рдЪрд┐рд╣реНрдирд┐рдд рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдХреНрд╖рд╛ рдореЗрдВ (рдПрдХ рдмрдВрдж рдЦрдВрдб рдореЗрдВ) рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдкрд╛рда рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ, рдПрдХ рдЖрдпрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрд▓реНрдЯрд╛ (рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдиреАрдЪреЗ рд╣реЛрдЧрд╛), рдЬрд┐рд╕рдХреЗ рднреАрддрд░ рдпрд╣ рдкрд╛рда рдЦреАрдВрдЪрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреА рд╣реИ: рдЪрд┐рд╣реНрдирд┐рдд рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП:
QString mDisplayText; const QRect mDisplayRectDelta; void updateDisplayText();
рдирд┐рд░реНрдорд╛рдг рдореЗрдВ mDisplayRectDelta рдЖрд░рдВрднреАрдХрд░рдг рдЬреЛрдбрд╝реЗрдВ:
MultiListWidget::MultiListWidget() : mDisplayRectDelta(4, 1, -25, 0) { ... }
рдЕрдм, рдЪрд▓реЛ updateDisplayText () рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
void MultiListWidget::updateDisplayText() {
рдкрд╛рда рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рдкреЗрдВрдЯрдИрд╡реЗрдВрдЯ (QPaintEvent * рдШрдЯрдирд╛) рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рдЬреЗрдЯ рдХреЗ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдкрд░ рдкрд╛рда рдХреА рд╕реАрдорд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдЖрдкрдХреЛ рд░рд┐рд╕рд╛рдЗрд╡рд░ (рдХреНрдпреВрд░реАрд╕реЗрдИрд╡реЗрдВрдЯ * рдИрд╡реЗрдВрдЯ) рд╡рд┐рдзрд┐ рдХреЛ рднреА рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ:
protected: virtual void paintEvent(QPaintEvent *event); virtual void resizeEvent(QResizeEvent *event);
рдФрд░ рдЙрдирдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
void MultiListWidget::paintEvent(QPaintEvent *event) { (void)event; QStylePainter painter(this); painter.setPen(palette().color(QPalette::Text)); QStyleOptionComboBox option; initStyleOption(&option);
рдпрд╣ рдХреЗрд╡рд▓ рдореЙрдбрд▓ рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░рджрд░реНрд╢рд┐рдд рдкрд╛рда рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд░рд╣рддрд╛ рд╣реИред рдХреЙрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ AddDisplayText () collectCheckedItems () рдХреЗ рдЕрдВрдд рдореЗрдВ рдФрд░ рд╡рд┐рдЬреЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдВ:
void MultiListWidget::setCheckedItems(const QStringList &items) { ... updateDisplayText(); repaint(); }
рдЬреАрдЯреАрдХреЗ рдФрд░ рдореИрдХ рдХреА рд╢реИрд▓рд┐рдпреЛрдВ рдореЗрдВ, рдПрдХ
рдмрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реВрдЪреА рдореЗрдВ рдЭрдВрдбреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдмрдЧ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рдЬреЗрдЯ рдХреА рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ рдореЗрдВ рдХреЙрдореНрдмреЛрдХреНрд╕-рдкреЙрдкрдЕрдк рдорд╛рди рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдЗрд╕ рдХреЛрдб рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ):
setStyleSheet("QComboBox { combobox-popup: 1px }");
рдЪрд┐рддреНрд░:


рд╕реНрд░реЛрдд рдХреЛрдб:
multilist.h #ifndef MULTILIST_H #define MULTILIST_H #include <QtGui> class MultiListWidget : public QComboBox { Q_OBJECT Q_PROPERTY(QStringList checkedItems READ checkedItems WRITE setCheckedItems) public: MultiListWidget(); virtual ~MultiListWidget(); QStringList checkedItems() const; void setCheckedItems(const QStringList &items); protected: virtual void paintEvent(QPaintEvent *event); virtual void resizeEvent(QResizeEvent *event); private: QStringList mCheckedItems; void collectCheckedItems(); QString mDisplayText; const QRect mDisplayRectDelta; void updateDisplayText(); private slots: void slotModelRowsInserted(const QModelIndex &parent, int start, int end); void slotModelRowsRemoved(const QModelIndex &parent, int start, int end); void slotModelItemChanged(QStandardItem *item); }; #endif // MULTILIST_H
multilist.cpp #include "multilist.h" MultiListWidget::MultiListWidget() : mDisplayRectDelta(4, 1, -25, 0) { setStyleSheet("QComboBox { combobox-popup: 1px }"); connect(model(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(slotModelRowsInserted(QModelIndex,int,int))); connect(model(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(slotModelRowsRemoved(QModelIndex,int,int))); QStandardItemModel *standartModel = qobject_cast<QStandardItemModel*>(model()); connect(standartModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(slotModelItemChanged(QStandardItem*))); } MultiListWidget::~MultiListWidget() { } QStringList MultiListWidget::checkedItems() const { return mCheckedItems; } void MultiListWidget::setCheckedItems(const QStringList &items) { QStandardItemModel *standartModel = qobject_cast<QStandardItemModel*>(model()); disconnect(standartModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(slotModelItemChanged(QStandardItem*))); for (int i = 0; i < items.count(); ++i) { int index = findText(items.at(i)); if (index != -1) { standartModel->item(index)->setData(Qt::Checked, Qt::CheckStateRole); } } connect(standartModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(slotModelItemChanged(QStandardItem*))); collectCheckedItems(); } void MultiListWidget::paintEvent(QPaintEvent *event) { (void)event; QStylePainter painter(this); painter.setPen(palette().color(QPalette::Text)); QStyleOptionComboBox option; initStyleOption(&option); painter.drawComplexControl(QStyle::CC_ComboBox, option); QRect textRect = rect().adjusted(mDisplayRectDelta.left(), mDisplayRectDelta.top(), mDisplayRectDelta.right(), mDisplayRectDelta.bottom()); painter.drawText(textRect, Qt::AlignVCenter, mDisplayText); } void MultiListWidget::resizeEvent(QResizeEvent *event) { (void)event; updateDisplayText(); } void MultiListWidget::collectCheckedItems() { QStandardItemModel *standartModel = qobject_cast<QStandardItemModel*>(model()); mCheckedItems.clear(); for (int i = 0; i < count(); ++i) { QStandardItem *currentItem = standartModel->item(i); Qt::CheckState checkState = static_cast<Qt::CheckState>(currentItem->data(Qt::CheckStateRole).toInt()); if (checkState == Qt::Checked) { mCheckedItems.push_back(currentItem->text()); } } updateDisplayText(); repaint(); } void MultiListWidget::updateDisplayText() { QRect textRect = rect().adjusted(mDisplayRectDelta.left(), mDisplayRectDelta.top(), mDisplayRectDelta.right(), mDisplayRectDelta.bottom()); QFontMetrics fontMetrics(font()); mDisplayText = mCheckedItems.join(", "); if (fontMetrics.size(Qt::TextSingleLine, mDisplayText).width() > textRect.width()) { while (mDisplayText != "" && fontMetrics.size(Qt::TextSingleLine, mDisplayText + "...").width() > textRect.width()) { mDisplayText.remove(mDisplayText.length() - 1, 1); } mDisplayText += "..."; } } void MultiListWidget::slotModelRowsInserted(const QModelIndex &parent, int start, int end) { (void)parent; QStandardItemModel *standartModel = qobject_cast<QStandardItemModel*>(model()); disconnect(standartModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(slotModelItemChanged(QStandardItem*))); for (int i = start; i <= end; ++i) { standartModel->item(i)->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); standartModel->item(i)->setData(Qt::Unchecked, Qt::CheckStateRole); } connect(standartModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(slotModelItemChanged(QStandardItem*))); } void MultiListWidget::slotModelRowsRemoved(const QModelIndex &parent, int start, int end) { (void)parent; (void)start; (void)end; collectCheckedItems(); } void MultiListWidget::slotModelItemChanged(QStandardItem *item) { (void)item; collectCheckedItems(); }
main.cpp #include "multilist.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MultiListWidget *multiList = new MultiListWidget(); multiList->addItems(QStringList() << "One" << "Two" << "Three" << "Four"); multiList->setCheckedItems(QStringList() << "One" << "Three"); QHBoxLayout *layout = new QHBoxLayout(); layout->addWidget(new QLabel("Select items:")); layout->addWidget(multiList, 1); QWidget widget; widget.setWindowTitle("MultiList example"); widget.setLayout(layout); widget.show(); return app.exec(); }
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!