[英]Add QListView to QComboBox for proper display of scrollbar
我有一個帶有長文本的組合框以適應組合框,所以當我下拉時,它們顯示為“very_long ... long_text”。
當我做:
QAbstractItemView* view = myCombo->view();
view->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
出現水平滾動條,但它處於非活動狀態,並且......仍然存在於字符串的中間。
這個bug報告說,要獲得水平滾動條,可以使用自定義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();
然后我得到一個空的組合。 謝謝你的回答。
您需要為列表視圖設置固定寬度,並在調整組合框大小時更新它。 您還需要調整列表視圖的彈出窗口寬度。 您可以使用事件過濾器來完成。 這是一個概念驗證實現(不要在生產中以這種方式編寫):
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.