Как исправить размер элементов QHBoxLayout и добавить раскрывающийся список к каждому элементу в QHBoxLayout

У меня есть пользовательский класс окна

#define NAME_WIDTH 150
#define NAME_HEIGHT 20

ObjectWindow::ObjectWindow(QWidget * parent)
{

}

void ObjectWindow::SetKey(KeyObject * keyObj)
{
QGridLayout * layout = new QGridLayout(this);

nameField = new QTextEdit(this);
nameField->setText(keyObj->name);
nameField->setGeometry(nameField->geometry().x(), nameField->geometry().y(),
NAME_WIDTH, NAME_HEIGHT);
layout->addWidget(nameField);

QHBoxLayout * picsLayout = new QHBoxLayout(this);
for(std::vector<ImageInstance*>::iterator imgObj = keyObj->images.begin(); imgObj != keyObj->images.end(); imgObj++)
{
QComboBox * folderList = new QComboBox;
picsLayout->addWidget(folderList);

QImage image((*imgObj)->imgPath);
QLabel * picLabel = new QLabel;
picLabel->setPixmap(QPixmap::fromImage(image).scaled(200, 200, Qt::KeepAspectRatio, Qt::SmoothTransformation));
picsLayout->addWidget(picLabel);
}
layout->addLayout(picsLayout, 2, 0);QPushButton * saveBtn = new QPushButton(this);
saveBtn->setText("Save");
connect(saveBtn, SIGNAL(released()),this, SLOT(Save()));
layout->addWidget(saveBtn);

setLayout(layout);
}

Что мне нужно

  • небольшое текстовое поле для установки имени, я не понимаю, почему SetGeometry не работает

  • выпадающий список над каждым изображением. Я могу создать макет QHVertical для каждого набора изображений и списка, но, может быть, есть более простой способ сделать это?

введите описание изображения здесь

3

Решение

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

Тогда основное преимущество использования QGridLayout заключается в том, что вам не нужно создавать другие макеты. Он действует как сетка, куда вы помещаете свои виджеты, немного как Excel (и другие программы для работы с электронными таблицами).

О, и я вижу, что вы не создаете виджеты в конструкторе (который кажется пустым), это то, что люди обычно делают, потому что создание пользовательского интерфейса может быть дорогим, и вы просто хотите обновить его, когда это уместно, а не перестраивать весь пользовательский интерфейс просто обновить поле. Но без большего количества кода я не могу сказать, когда эта функция вызывается.

Вы можете попробовать что-то вроде этого:

QGridLayout * layout = new QGridLayout(this);

nameField = new QLineEdit(this);
nameField->setText(keyObj->name);
layout->addWidget(nameField, 0, 0, -1, 1); // expand to the right edge

int currentColumn = 0;
for(std::vector<ImageInstance*>::iterator imgObj = keyObj->images.begin(); imgObj != keyObj->images.end(); imgObj++)
{
QComboBox * folderList = new QComboBox;
layout->addWidget(folderList, 1, currentColumn);

QPixmap pixmap((*imgObj)->imgPath);
pixmap = pixmap.scaled(200, 200, Qt::KeepAspectRatio, Qt::SmoothTransformation);
QLabel * picLabel = new QLabel(this);
picLabel->setPixmap(pixmap);
layout->addWidget(picLabel, 2, currentColumn);
++currentColumn;
}QPushButton * saveBtn = new QPushButton("Save", this);
connect(saveBtn, SIGNAL(released()),this, SLOT(Save()));
layout->addWidget(saveBtn, 3, 0, -1, 1);

setLayout(layout);

Но, кажется, не стоит добавлять такие виджеты горизонтально. Что будет, если в этом векторе 100 элементов? Вы должны исследовать использование чего-то вроде QScrollArea или изменение пользовательского интерфейса, чтобы дать вашему клиенту лучший способ их просматривать и редактировать (но без большего контекста, кажется, трудно дать больше советов).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]