C++ 将QListView添加到QComboBox以正确显示滚动条
我有一个包含长文本的组合框,可以放入组合框中,因此当我下拉时,它们会显示为“非常长…长文本” 当我这样做时:C++ 将QListView添加到QComboBox以正确显示滚动条,c++,qt,qcombobox,qlistview,C++,Qt,Qcombobox,Qlistview,我有一个包含长文本的组合框,可以放入组合框中,因此当我下拉时,它们会显示为“非常长…长文本” 当我这样做时: QAbstractItemView* view = myCombo->view(); view->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOn ); 水平滚动条出现,但处于非活动状态,…-s仍然出现在字符串的中间 这意味着要获得水平滚动条,可以使用定制的QListView。那么,我应该如何构造这个定制的QListVi
QAbstractItemView* view = myCombo->view();
view->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
水平滚动条出现,但处于非活动状态,…-s仍然出现在字符串的中间
这意味着要获得水平滚动条,可以使用定制的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();
然后我得到一个空的组合。谢谢您的回答。您需要为列表视图设置固定宽度,并在调整组合框大小时更新它。您还需要调整列表视图的弹出窗口宽度。您可以使用事件筛选器来完成此操作。下面是一个概念验证实现(不要在生产中使用这种风格):
您应该添加
combo->setModel(model)调用setView
前的code>。这解决了您的滚动条问题吗?是的,设置它会导致项目正确显示在组合中,但滚动条仍然丢失,尽管有额外的行lw->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn)代码>谢谢!基本上,调用lw->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn)就足够了代码>后组合->设置模型(模型);组合->设置视图(lw)代码>
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);