QGridLayout表现得像QVBoxLayout?

时间:2013-09-24 17:03:58

标签: c++ qt

我在使用QGridLayout时遇到了一些问题。以下是代码和解释:

for(int i =0; i<fileCount; i++)
{
    int row = 0;
    int col = 0;
    QString DocName = FilteredFiles.at(i).at(0);
    QLabel* DocTitle = new QLabel;
    DocTitle->setText(DocName);
    QLabel* DocIcon = new QLabel;
    if(FilteredFiles.at(i).at(2)== "WORD")
    {
        QPixmap Icon("C:blah/blah/blah/WordIcon.jpg");
        DocIcon->setPixmap(Icon);
    }
    else if(FilteredFiles.at(i).at(2)== "EXCEL")
    {
        QPixmap Icon("C:/blah/blah/blah/ExcelIcon.png");
        DocIcon->setPixmap(Icon);
    }
    else
    {
        QPixmap Icon("C:/blah/blah/blah/PpIcon.png");
        DocIcon->setPixmap(Icon);
    }
    GridContainer->addWidget(DocIcon);
    GridContainer->addWidget(DocTitle);
    TopGrid->addLayout(GridContainer,row,col,1,1);
    col++;
}
MainContainer->addLayout(TopGrid);

上面的代码应该制作两个Qlabels,pixmap将图像映射到其中一个标签,将pixmapped标签和常规标签添加到QVBoxLayout,然后将QVBoxLayout添加到QGridLayout。输出网格应该包含在一行中的所有内容,但它位于一列中。有人可以解释为什么会这样吗?

enter image description here

2 个答案:

答案 0 :(得分:1)

将变量col移出循环:

int col = 0;
for(int i =0; i<fileCount; i++)
{
    int row = 0;
    QString DocName = FilteredFiles.at(i).at(0);
    QLabel* DocTitle = new QLabel;
    DocTitle->setText(DocName);
    QLabel* DocIcon = new QLabel;
    if(FilteredFiles.at(i).at(2)== "WORD")
    {
        QPixmap Icon("C:blah/blah/blah/WordIcon.jpg");
        DocIcon->setPixmap(Icon);
    }
    else if(FilteredFiles.at(i).at(2)== "EXCEL")
    {
        QPixmap Icon("C:/blah/blah/blah/ExcelIcon.png");
        DocIcon->setPixmap(Icon);
    }
    else
    {
        QPixmap Icon("C:/blah/blah/blah/PpIcon.png");
        DocIcon->setPixmap(Icon);
    }
    GridContainer->addWidget(DocIcon);
    GridContainer->addWidget(DocTitle);
    TopGrid->addLayout(GridContainer,row,col,1,1);
    col++;
}
MainContainer->addLayout(TopGrid);

答案 1 :(得分:1)

我假设GridContainerQVBoxLayout。您将所有小部件添加到同一布局中。这可能是你的问题(以及在你的for循环中初始化你的col变量的问题,这是由user2672165指出的)。

您可能应该在循环中创建一个新的GridContainer对象并将其添加到TopGrid布局,而不是一遍又一遍地在TopGrid布局中添加相同的布局。

int col = 0;
int row = 0;
for(int i =0; i<fileCount; i++)
{
    GridContainer = new QVBoxLayout; // create a new layout
    QString DocName = FilteredFiles.at(i).at(0);
    QLabel* DocTitle = new QLabel;
    DocTitle->setText(DocName);
    QLabel* DocIcon = new QLabel;
    if(FilteredFiles.at(i).at(2)== "WORD")
    {
        QPixmap Icon("C:blah/blah/blah/WordIcon.jpg");
        DocIcon->setPixmap(Icon);
    }
    else if(FilteredFiles.at(i).at(2)== "EXCEL")
    {
        QPixmap Icon("C:/blah/blah/blah/ExcelIcon.png");
        DocIcon->setPixmap(Icon);
    }
    else
    {
        QPixmap Icon("C:/blah/blah/blah/PpIcon.png");
        DocIcon->setPixmap(Icon);
    }
    GridContainer->addWidget(DocIcon);
    GridContainer->addWidget(DocTitle);
    TopGrid->addLayout(GridContainer,row,col,1,1);
    col++;
}
MainContainer->addLayout(TopGrid);