2014-11-17 5 views
3

У меня есть сводка с длинными текстами, чтобы вписаться в combobox, поэтому, когда я выпадаю, они отображаются как «very_long ... long_text».Добавить QListView в QComboBox для правильного отображения полосы прокрутки

Когда я делаю:

QAbstractItemView* view = myCombo->view(); 
view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 

появляется горизонтальная полоса прокрутки, но он неактивен и ...- s все еще присутствуют в середине строки.

Этот bugreport говорит, что для получения горизонтальной полосы прокрутки можно использовать пользовательский QListView. Итак, как мне создать этот пользовательский QListView, который я добавлю затем в combobox?

Я пробовал следующее.

QListView* lw = new QListView(0); 

QStandardItemModel* model = new QStandardItemModel; 

QStandardItem *item = new QStandardItem("long long long long long long long long long long long long text 1"); 
QStandardItem *item2 = new QStandardItem("long long long long long long long long long long long long text 2"); 

model->insertRow(0, item); 
model->insertRow(1, item2); 

lw->setModel(model); 

QWidget* test = new QWidget(0); 
test->setGeometry(100, 100, 100, 150); 
test->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 

QGridLayout* layout = new QGridLayout; 

test->setLayout(layout); 

layout->addWidget(lw); 
layout->setSizeConstraint(QLayout::SizeConstraint::SetFixedSize); 

test->show(); 

Тогда у меня есть то, что я хочу видеть (к сожалению, я не разрешено прикреплять изображения), есть полоса прокрутки.

Но когда я хочу, чтобы добавить это комбо:

QListView* lw = new QListView(0); 

QStandardItemModel* model = new QStandardItemModel; 

QStandardItem *item = new QStandardItem("long long long long long long long long long long long long text 1"); 
QStandardItem *item2 = new QStandardItem("long long long long long long long long long long long long text 2"); 

model->insertRow(0, item); 
model->insertRow(1, item2); 

lw->setModel(model); 

QWidget* test = new QWidget(0); 
test->setWindowTitle("test"); 
test->setGeometry(100, 100, 100, 150); 
test->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 

QGridLayout* layout = new QGridLayout; 

test->setLayout(layout); 

QComboBox* combo = new QComboBox; 
combo->setGeometry(0, 0, 80, 20); 
combo->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); 
combo->setView(lw); 

layout->addWidget(combo); 
layout->setSizeConstraint(QLayout::SizeConstraint::SetFixedSize); 
test->show(); 

Тогда я получаю пустой комбо. Спасибо за любые ответы.

+0

Вы должны добавить 'combo-> setModel (модель),' 'перед вызовом setView'. Решает ли ваша проблема прокрутки? –

+0

Да, при установлении результата элементы отображаются в комбо правильно, но полоса прокрутки все еще отсутствует, в отличие от дополнительной строки 'lw-> setHorizontalScrollBarPolicy (Qt :: ScrollBarAlwaysOn);' – Terrordrone

ответ

1

Вам необходимо установить фиксированную ширину для просмотра списка и обновить ее при изменении размера поля со списком. Также вам нужно настроить ширину окна всплывающего окна списка. Вы можете сделать это с помощью фильтров событий. Вот реализация проверка концепции (не писать в таком стиле в производстве):

class Test_class : public QObject { 
    Q_OBJECT 
public: 
    Test_class() {} 
    virtual ~Test_class() {} 

    QComboBox* combo_box; 
    QListView* list_view; 
    bool eventFilter(QObject *object, QEvent *event) { 
    if (object == combo_box && event->type() == QEvent::Resize) { 
     list_view->setFixedWidth(combo_box->width()); 
    } else if (object == list_view && event->type() == QEvent::Show) { 
     list_view->window()->resize(list_view->width(), list_view->window()->height()); 
    } 
    return false; 
    } 
}; 

//... 
test->show(); 
lw->setFixedWidth(200); 
lw->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 

Test_class test_object; 
test_object.combo_box = combo; 
test_object.list_view = lw; 
lw->installEventFilter(&test_object); 
combo->installEventFilter(&test_object); 
+0

Спасибо! Казалось, что в основном достаточно назвать 'lw-> setHorizontalScrollBarPolicy (Qt :: ScrollBarAlwaysOn);' после 'combo-> setModel (model); combo-> setView (lw); ' – Terrordrone