代码之家  ›  专栏  ›  技术社区  ›  adi

为什么setspace属性不起作用?

  •  1
  • adi  · 技术社区  · 6 年前

    MainWindow::MainWindow(QWidget *parent) :
    QWidget(parent)
    {
    QVBoxLayout *parentLayout = new QVBoxLayout(this);//MainWindow is a QWidget
    
    this->setStyleSheet("background-color:red");
    
    for(int i=0;i<3;i++){
    QHBoxLayout* labelLineEdit = f1();
    
    parentLayout->addLayout(labelLineEdit);
    }
    parentLayout->setContentsMargins(0,0,40,0);
    }
    
    QHBoxLayout* MainWindow::f1()
    {
    
    QHBoxLayout *layout = new QHBoxLayout;
    
    QLabel *label = new QLabel("Movie");
    label->setStyleSheet("background-color:blue;color:white");
    label->setMinimumWidth(300);
    label->setMaximumWidth(300);
    
    layout->addWidget(label);
    
    QLineEdit *echoLineEdit = new QLineEdit;
    //echoLineEdit->setMaximumWidth(120);//line:99
    echoLineEdit->setMaximumHeight(50);
    echoLineEdit->setMinimumHeight(50);
    
    echoLineEdit->setStyleSheet("background-color:brown");
    
    layout->addWidget(echoLineEdit);
    
    layout->setSpacing(0);
    
    return layout;
    
    }
    

    我的输出是这样的。 enter image description here

    我希望我的lineedit宽度减小,所以我取消了第99行的注释,我的输出如下所示。 enter image description here

    2 回复  |  直到 6 年前
        1
  •  2
  •   scopchanov    6 年前

    如果你有一个自动布局,一些东西应该占空的空间。如果小部件的策略设置为 将被扩展到填充空白的小部件。如果您使小部件的大小固定( )或者用 setMaximum... 空位将分布在整个布局中。如果这是不可取的,在您的情况下,应该添加一些东西到布局,以采取这个空白的空间。你有两个选择。我个人会用 QBoxLayout::addStretch 而不是 . 下面是解决方案,以及对问题中的代码进行一些清理:

    #include "MainWindow.h"
    #include <QHBoxLayout>
    #include <QLineEdit>
    #include <QLabel>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent)
    {
        auto *widget = new QWidget(this);
        auto *layoutMain = new QVBoxLayout(widget);
    
        for (int n = 0; n < 3; n++)
            f1(layoutMain);
    
        layoutMain->setContentsMargins(0, 0, 40, 0);
        layoutMain->addStretch();
    
        setCentralWidget(widget);
        setStyleSheet("background-color: red");
    }
    
    void MainWindow::f1(QVBoxLayout *layoutMain)
    {
        auto *layoutRow = new QHBoxLayout();
        auto *label = new QLabel("Movie", this);
        auto *lineEdit = new QLineEdit(this);
    
        label->setStyleSheet("background-color: blue; color: white");
        label->setFixedWidth(300);
    
        lineEdit->setMaximumWidth(120);
        lineEdit->setFixedHeight(50);
        lineEdit->setStyleSheet("background-color: brown");
    
        layoutRow->addWidget(label);
        layoutRow->addWidget(lineEdit);
        layoutRow->addStretch();
        layoutRow->setSpacing(0);
    
        layoutMain->addLayout(layoutRow);
    }
    

    这将产生以下结果:

    enter image description here

    如果希望空行位于每行的开头,有效地将小部件向右对齐,只需将行 layoutRow->addStretch(); layoutRow->addWidget(label); . 要使小部件水平居中,请添加另一个拉伸,以便 还有一个 他们。就像你可以把小部件垂直放置在中间一样 layoutMain->addStretch(); 之前 for (int n = 0; n < 3; n++)

        2
  •  2
  •   pat    6 年前

    您应该为每行添加一个间隔项(请参阅 QSpacerItem

    QHBoxLayout* MainWindow::f1()
    {
    
        QHBoxLayout *layout = new QHBoxLayout;
    
        QLabel *label = new QLabel("Movie");
        label->setStyleSheet("background-color:blue;color:white");
        label->setMinimumWidth(300);
        label->setMaximumWidth(300);
    
        layout->addWidget(label);
    
        QLineEdit *echoLineEdit = new QLineEdit;
        echoLineEdit->setMaximumWidth(120);//line:99
        echoLineEdit->setMaximumHeight(50);
        echoLineEdit->setMinimumHeight(50);
    
        echoLineEdit->setStyleSheet("background-color:brown");
    
        layout->addWidget(echoLineEdit);
    
        //add spacer here
        QSpacerItem * item = new QSpacerItem(100, 1, QSizePolicy::Expanding, QSizePolicy::Fixed);
        layout->addItem(item);
    
        layout->setSpacing(0);
    
        return layout;
    }