我有自定义窗口类
#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布局,但也许有更简单的方法可以做到这一点?
答案 0 :(得分:2)
如果您只是希望用户设置名称,则QLineEdit可能就足够了。
然后使用QGridLayout的主要优点是您不需要创建其他布局。它就像一个网格,你放置你的小部件,有点像Excel(和其他电子表格程序)。
哦,我发现你没有在构造函数中构建Widgets(这似乎是空的),这是人们通常做的事情,因为构建UI可能很昂贵,而你只是想在相关时更新它,不是为了更新字段而重建整个UI。但是没有更多的代码,我无法判断何时调用此函数。
您可以尝试这样的事情:
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的内容或修改UI,以便为您的客户提供查看和编辑这些内容的最佳方式(但没有更多上下文,似乎很难提供更多建议)。