2015-09-30 64 views
0

我有一个QWidget rzadKontener,它表示QListWidget中的一行。Qt C++ - QListWidget布局不能缩放以适应内容

QWidget* rzadKontener = new QWidget; 
QHBoxLayout* rzadKontenerLayout = new QHBoxLayout(); 
rzadKontenerLayout->setAlignment(Qt::AlignLeft); 
rzadKontenerLayout->setAlignment(Qt::AlignTop); 
rzadKontener->setObjectName("rzadKontener_" + poziom); 
rzadKontener->setFixedHeight(200); 
rzadKontener->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 
rzadKontener->setLayout(rzadKontenerLayout); 

(....) 

QListWidgetItem* newItemRzad = new QListWidgetItem; 
newItemRzad->setSizeHint(QSize(listSize*225, 200)); 
QString poziomText = poziom; 
newItemRzad->setText(poziomText); 
newItemRzad->setTextColor(QColor(Qt::white)); 

ui->listWidgetZdjeciaModelu->addItem(newItemRzad); 
ui->listWidgetZdjeciaModelu->setItemWidget(newItemRzad, rzadKontener); 

它包含许多项目,即QWidgets与图片,按钮和文本。然后它被放置在一个QListWidget作为一行充满了这些项目。当我一次添加5个项目时,在创建新的rzadKontener时,会出现QListWidget中的滚动条。但是如果我以后再添加3个,然后再添加2个项目,他们会在没有滚动条的情况下跳出界限。我如何强制布局缩放到新的rzadKontener的大小?

+0

很简单:您只在某个容器小部件中创建了布局。但是你希望布局的内容被缩放,对吧? rzadKontener-> addWidget(pSomeOtheWidget);我猜。 – AlexanderVX

+0

@AlexanderVX'rzadKontenerLayout-> addWidget(...)'我猜 – jhnnslschnr

+0

@AlexanderVX我正在那样做。 'ui-> listWidgetZdjeciaModelu-> findChild (objectName) - > layout() - > addWidget(zdjecieKontener);'其中'objectName'等于'“rzadKontener_”+ poziom'。 'zdjecieKontener'是一张图片,一个名字,一条线和一个按钮。它增加了它,但不能缩放。 – Petersaber

回答

1

我找到了答案。我不应该修改列表中的QWidget,而应该修改它在(父...)中的QListWidgetItem

QWidget* newPicture = new QWidget; 
yadda yadda yadda (....) 
int currentRowWidth = ui->listWidgetZdjeciaModelu->findChild<QWidget*>(objectName)->width(); //gets max width of rzadKontener, which fills the entirety of the row - it equals the QListWidgetItem's width 
int newWidth = currentRowWidth + 225; //225 is a fixed width of newPicture 
ui->listWidgetZdjeciaModelu->item(0)->setSizeHint(QSize(newWidth, 200)); 

ui->listWidgetZdjeciaModelu->findChild<QWidget*>(objectName)->layout()->addWidget(newPicture); 

我们可以做ui->listWidgetZdjeciaModelu->item(0)->setSizeHint(QSize(newWidth, 200));,而不是一个特定行(->item(row)),因为该列表是一个矩形。无论我们放大哪一行,整个事情都会延伸。

但是,如果你想获得的行号,你可以这样来做:

int row=0; 
//we make a list. Each of my QListWidgetItem has a unique string poziom in it, so I can filter by that. 
QList<QListWidgetItem *> items = ui->listWidgetZdjeciaModelu->findItems(poziom, Qt::MatchContains); 
if (items.size() > 0) { 
    //we use the first (and only, in my case) item on this list to get row number 
    row = ui->listWidgetZdjeciaModelu->row(items[0]); 
} 

奇怪的是,我已经尝试过这一点。一定会一直犯一个错字。