Qt - Почему мои виджеты не выстраиваются в линию, используя вертикальный макет внутри сплиттера? - PullRequest
0 голосов
/ 12 апреля 2011

Как показано на скриншоте ниже, почему мои виджеты не выстраиваются в линию с использованием вертикальной компоновки внутри сплиттера?

Window screenshot

/********************************************************************************
** Form generated from reading UI file 'test.ui'
**
** Created: Tue Apr 12 16:51:51 2011
**      by: Qt User Interface Compiler version 4.6.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_TEST_H
#define UI_TEST_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QGridLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QLineEdit>
#include <QtGui/QListWidget>
#include <QtGui/QMainWindow>
#include <QtGui/QSplitter>
#include <QtGui/QTreeWidget>
#include <QtGui/QVBoxLayout>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QGridLayout *gridLayout;
    QSplitter *splitter;
    QTreeWidget *treeWidget;
    QWidget *widget;
    QVBoxLayout *verticalLayout;
    QLineEdit *lineEdit;
    QListWidget *listWidget;

    void setupUi(QMainWindow *MainWindow)
    {
    if (MainWindow->objectName().isEmpty())
        MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
    MainWindow->resize(800, 600);
    centralwidget = new QWidget(MainWindow);
    centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
    gridLayout = new QGridLayout(centralwidget);
    gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
    splitter = new QSplitter(centralwidget);
    splitter->setObjectName(QString::fromUtf8("splitter"));
    splitter->setOrientation(Qt::Horizontal);
    treeWidget = new QTreeWidget(splitter);
    QTreeWidgetItem *__qtreewidgetitem = new QTreeWidgetItem();
    __qtreewidgetitem->setText(0, QString::fromUtf8("1"));
    treeWidget->setHeaderItem(__qtreewidgetitem);
    treeWidget->setObjectName(QString::fromUtf8("treeWidget"));
    splitter->addWidget(treeWidget);
    widget = new QWidget(splitter);
    widget->setObjectName(QString::fromUtf8("widget"));
    verticalLayout = new QVBoxLayout(widget);
    verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
    verticalLayout->setContentsMargins(0, 0, 0, 0);
    lineEdit = new QLineEdit(widget);
    lineEdit->setObjectName(QString::fromUtf8("lineEdit"));

    verticalLayout->addWidget(lineEdit);

    listWidget = new QListWidget(widget);
    listWidget->setObjectName(QString::fromUtf8("listWidget"));

    verticalLayout->addWidget(listWidget);

    splitter->addWidget(widget);

    gridLayout->addWidget(splitter, 0, 0, 1, 1);

    MainWindow->setCentralWidget(centralwidget);

    retranslateUi(MainWindow);

    QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
    MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_TEST_H

Это всего лишь фиктивный пользовательский интерфейс, загруженныйздесь для цели вопроса.В своем реальном дизайне пользовательского интерфейса я перепробовал все мыслимые комбинации, но как только я начал использовать сплиттеры, все вышло из строя.

Ответы [ 5 ]

1 голос
/ 12 апреля 2011

Я вытащил дизайнера и сделал свой макет без каких-либо проблем. Как показано в иерархии в правом верхнем углу моего скриншота, я создал редактирование строки и редактирование текста. Присоединились те, кто в вертикальной компоновке. Создал treeWidget и соединил его с макетом в горизонтальном разделителе.

Мне удалось сделать так, чтобы он выглядел как ваш, отредактировав свойства вертикального макета так, чтобы было ненулевое поле макета. Но похоже, что сгенерированный код явно устанавливает ноль в вашем ...

Widgets line up here

0 голосов
/ 12 апреля 2011

убедитесь, что у verticalLayout нет поля (которое по умолчанию).

verticalLayout-> setContentsMargins (0, 0, 0, 0);

0 голосов
/ 12 апреля 2011

Виджет в правой части разделителя (тот, который содержит QLineEdit и QListWidget), вероятно, имеет значения по умолчанию для макета. В QtCreator выберите QWidget, затем в редакторе свойств прокрутите весь путь до раздела Layout и установите 4 значения для layoutLeftMargin, layoutTopMargin, layoutRightMargin и layoutBottomMargin равными 0.

0 голосов
/ 12 апреля 2011

Убедитесь, что виджет дерева и виджет с вертикальной компоновкой имеют одинаковую политику размера (например, QSizePolicy :: MinimumExpanding ).

0 голосов
/ 12 апреля 2011

Вы создаете макет, но никогда не назначаете его.

Если вы хотите, чтобы ваши виджеты были выровнены по вертикали в вашем сплиттере, вам нужно установить вертикальный макет для сплиттера, а затем добавить все ваши подвиджеты в макет.

...