2015-09-30 61 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]); 
} 

奇怪的是,我已經嘗試過這一點。一定會一直犯一個錯字。