рдмрд╣реБ рд╡рд┐рдХрд▓реНрдк QComboBox рдореЗрдВ


рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╕реНрд╡реАрд░
(рд╕рдВрднрд╡рддрдГ рдкреЛрд╕реНрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд)

рдХрднреА-рдХрднреА, 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 рдореЙрдбрд▓ рдореЗрдВ рдХрдИ рд╕рдВрдХреЗрдд рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЖрдЗрдЯрдордЪреЗрдВрдЬ (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) { //   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::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) { //     (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*))); } 

рдореЙрдбрд▓ рд╕реЗ рдЖрдЗрдЯрдо рдирд┐рдХрд╛рд▓рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ 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() { //    , mDisplayRectDelta   ""  //   ,    ,   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 += "..."; } } 

рдкрд╛рда рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рдкреЗрдВрдЯрдИрд╡реЗрдВрдЯ (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); //     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(); } 

рдпрд╣ рдХреЗрд╡рд▓ рдореЙрдбрд▓ рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░рджрд░реНрд╢рд┐рдд рдкрд╛рда рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд░рд╣рддрд╛ рд╣реИред рдХреЙрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ 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(); } 


рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/In215289/


All Articles