2014-11-17 29 views
3

我有一个长文本的组合框以适合组合框,所以当我下拉时,它们显示为“very_long ... long_text”。将QListView添加到QComboBox以正确显示滚动条

当我这样做:

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

的水平滚动出现,但它是无效的和...- s为仍然存在于弦的中间。

bugreport说,要获得水平滚动条,可以使用自定义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(); 

然后我得到一个空连击。感谢任何答案。

+0

您应该在调用setView之前添加'combo-> setModel(model);'。这是否解决您的滚动条问题? –

+0

是的,设置它的结果项目正确显示在组合中,但滚动条仍然丢失,尽管额外的行'lw-> setHorizo​​ntalScrollBarPolicy(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

谢谢!在'combo-> setModel(model)'后面调用'lw-> setHorizo​​ntalScrollBarPolicy(Qt :: ScrollBarAlwaysOn)''就足够了。 combo-> setView(lw);' – Terrordrone