QComboBox + QTreeView рдЯреНрд░рд┐рдХреНрд╕

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, QComboBox рдореЗрдВ рдХрднреА-рдХрднреА рдкреЗрдбрд╝ рдЬреИрд╕реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП Qt рдореЗрдВ рдорд╛рдирдХ рдШрдЯрдХ QTreeView рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
QComboBox рдЗрд╕ рдШрдЯрдХ рдХреЛ рдЕрдкрдиреЗ рдЕрдВрджрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЫреЛрдЯреЗ рд╕реНрдерд╛рди рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдкреЗрдбрд╝ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрд╕ рдШрдЯрдХ рдХреЛ рд╕реНрд╡рдпрдВ рдмрдирд╛рдПрдВ рдЬреЛ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо QComboBox рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рдЧреБрдг рджреЗрддреЗ рд╣реИрдВред

рдХрдХреНрд╖рд╛ рдХреЗ рдмрдВрдж рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ, рд╣рдо рдХреНрдпреВрдЯреНрд░рд┐рд╡реНрдпреВ рд╡рд░реНрдЧ рдХреЗ m_view рдЪрд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ QComboBox рдореЗрдВ рдкреЗрдбрд╝ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛, 2 рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдЦреЛрд▓рдиреЗ рдФрд░ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рдШрдЯрдХ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ:

  • рд╢реВрдиреНрдп рджрд┐рдЦрд╛рд╡рд╛ () рдУрд╡рд░рд░рд╛рдЗрдб; - рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ
  • рд╢реВрдиреНрдп рдЫрд┐рдкрд╛рдирд╛ () рдУрд╡рд░рд░рд╛рдЗрдб; - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рд╣рдо HideColumn (int n) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ QTreeView рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕реНрддрдВрднреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдореЙрдбрд▓ рдореЗрдВ рдХрдИ рдХреЙрд▓рдо рд╣реИрдВ, рддреЛ QComboBox рдЙрди рд╕рднреА рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ (рдорд╛рдирдХ рдШрдЯрдХ рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ), рдЬреЛ рдмрд╣реБрдд рдЦрд░рд╛рдм рджрд┐рдЦреЗрдВрдЧреЗ

treecombobox.h

#ifndef TREECOMBOBOX_H #define TREECOMBOBOX_H #include <QtWidgets/QComboBox> #include <QtWidgets/QTreeView> class TreeComboBox final : public QComboBox { public: TreeComboBox(); void showPopup() override; void hidePopup() override; void hideColumn(int n); void expandAll(); void selectIndex(const QModelIndex &index); private: QTreeView *m_view = nullptr; }; #endif //TREECOMBOBOX_H 

treecombobox.cpp

 TreeComboBox::TreeComboBox() { m_view = new QTreeView; m_view->setFrameShape(QFrame::NoFrame); m_view->setEditTriggers(QTreeView::NoEditTriggers); m_view->setAlternatingRowColors(true); m_view->setSelectionBehavior(QTreeView::SelectRows); m_view->setRootIsDecorated(false); m_view->setWordWrap(true); m_view->setAllColumnsShowFocus(true); m_view->setItemsExpandable(false); setView(m_view); m_view->header()->setVisible(false); } void TreeComboBox::hideColumn(int n) { m_view->hideColumn(n); } void TreeComboBox::expandAll() { m_view->expandAll(); } void TreeComboBox::selectIndex(const QModelIndex &index) { setRootModelIndex(index.parent()); setCurrentIndex(index.row()); m_view->setCurrentIndex( index ); } void TreeComboBox::showPopup() { setRootModelIndex(QModelIndex()); QComboBox::showPopup(); } void TreeComboBox::hidePopup() { setRootModelIndex(m_view->currentIndex().parent()); setCurrentIndex( m_view->currentIndex().row()); QComboBox::hidePopup(); } 

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдо рдЙрд╕ рдкреЗрдбрд╝ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рддрд╛рдХрд┐ рд╡рд╣ QComboBox рдореЗрдВ "рдПрдореНрдмреЗрдбреЗрдб" рджрд┐рдЦреЗ, рд╣реЗрдбрд░ рдирд┐рдХрд╛рд▓реЗрдВ, рд╡рд┐рд╕реНрддрд╛рд░ рддрддреНрд╡реЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рди рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред

QComboBox рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд рдЖрдЗрдЯрдо рдХреЛ рдареАрдХ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЪрд╛рд▓ showPopup () рдФрд░ HidePopup () рдлрд╝рдВрдХреНрд╢рди рд╣реИред

рдЪреВрдБрдХрд┐ QComboBox рдПрдХ "рдлреНрд▓реИрдЯ" рдореЙрдбрд▓ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЯреНрд░реА рдореЙрдбрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрдпрдирд┐рдд рддрддреНрд╡ рдХрд╛ рд╕рд╣реА рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдореВрд▓ рддрддреНрд╡ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
рд╢реЛрдкреЙрдк ()

рд░реВрдЯ рдПрд▓рд┐рдореЗрдВрдЯ - рд╣рдордиреЗ рд░реВрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдПрдХ рдЕрдорд╛рдиреНрдп рдореЙрдбрд▓ рдЗрдВрдбреЗрдХреНрд╕ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ QComboBox рдореЙрдбрд▓ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗред
рдЫрд┐рдкрд╛рдирд╛

рдореВрд▓ рддрддреНрд╡ - рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд рдореЙрдбрд▓ рддрддреНрд╡ рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдореВрд▓ рддрддреНрд╡ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖, рд╣рдо рдЪрдпрдирд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрддреНрд╡ рдХреЛ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; QStandardItemModel model; QStandardItem *parentItem = model.invisibleRootItem(); for (int i = 0; i < 4; ++i) { QStandardItem *item = new QStandardItem(QString("item %0").arg(i)); parentItem->appendRow(item); parentItem = item; } TreeComboBox t; t.setModel(&model); t.expandAll(); auto lay = new QVBoxLayout; lay->addWidget( &t); w.setLayout(lay); w.show(); return a.exec(); } 

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


All Articles