#c #qt #widget #qt-designer
#c #qt #виджет #qt-designer
Вопрос:
Как показано на скриншоте ниже, почему мои виджеты не выстраиваются в линию с использованием вертикальной компоновки внутри разделителя?
/********************************************************************************
** 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
Это всего лишь фиктивный пользовательский интерфейс, загруженный здесь для целей вопроса. В моем реальном дизайне пользовательского интерфейса я перепробовал все мыслимые комбинации, но как только я начинаю использовать разделители, все выходит из строя.
Комментарии:
1. не могли бы вы опубликовать файл .ui, чтобы мы могли открыть его в designer?
Ответ №1:
Я запустил designer и создал ваш макет вообще без каких-либо проблем. Как показано в иерархии в правом верхнем углу моего скриншота, я создал редактирование строк и редактирование текста. Объединил их в вертикальную компоновку. Создал TreeWidget и объединил его с макетом в горизонтальном разделителе.
Я смог сделать его похожим на ваш, отредактировав свойства вертикальной компоновки таким образом, чтобы было ненулевое поле компоновки. Но похоже, что сгенерированный код явно устанавливает это значение равным нулю в вашем…
Ответ №2:
Вы создаете компоновку, но никогда не назначаете их.
Если вы хотите, чтобы ваши виджеты были выровнены по вертикали в разделителе, вам нужно установить вертикальную компоновку для разделителя, а затем добавить все ваши подвиджеты в макет.
Комментарии:
1. Я думаю, что я плохо объяснил себя, я хочу, чтобы макет выглядел точно так же, как и там, но верхний край treewidget и текстового поля должны быть выровнены. Я не могу понять, почему при использовании разделителя кажется, что поля / отступы вокруг элементов управления в вертикальной компоновке справа, но не у treewidget слева?
Ответ №3:
Убедитесь, что виджет дерева и виджет с вертикальной компоновкой имеют одинаковую политику размера (например, QSizePolicy::MinimumExpanding).
Ответ №4:
Виджет на правой стороне разделителя (тот, который содержит QLineEdit и QListWidget), вероятно, имеет значения по умолчанию для макета. В QtCreator выберите QWidget, затем в редакторе свойств прокрутите до конца вниз до раздела Layout и установите для 4 значений layoutLeftMargin, layoutTopMargin, layoutRightMargin и layoutBottomMargin значение 0.
Ответ №5:
убедитесь, что VerticalLayout не имеет полей (которые у него есть по умолчанию).
VerticalLayout->setContentsMargins(0, 0, 0, 0);