Добавьте QListView в QComboBox для правильного отображения полосы прокрутки

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

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

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

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

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

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

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();

Затем я получаю пустую комбинацию. Спасибо за любые ответы.


person Terrordrone    schedule 17.11.2014    source источник
comment
Вы должны добавить combo->setModel(model); перед вызовом setView. Решит ли это вашу проблему с полосами прокрутки?   -  person Pavel Strakhov    schedule 18.11.2014
comment
Да, его установка приводит к правильному отображению элементов в комбо, но полоса прокрутки по-прежнему отсутствует, несмотря на дополнительную строку lw->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOn );   -  person Terrordrone    schedule 18.11.2014


Ответы (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);
person Pavel Strakhov    schedule 18.11.2014
comment
Спасибо! Казалось, что в принципе достаточно было вызвать lw->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); после combo->setModel( model ); combo->setView( lw); - person Terrordrone; 20.11.2014