2014-11-07 2 views
0

Я пытаюсь создать пользовательский виджет в QT, который выглядит примерно так: enter image description hereКак создать пользовательский макет для виджета

красные квадраты будут отображать изображение/значок. Как я могу достичь этого макета с помощью кодирования виджета? Мне нужно будет создать многие из этих виджетов с одинаковой компоновкой, но с разными значениями в своих ярлыках. В идеале я покажу эти виджеты в виде списка с полосой прокрутки в моем главном окне. Но сейчас я изо всех сил пытаюсь создать макет для этих виджетов с помощью кода. Буду признателен за любую оказанную помощь.

ответ

3

Вы должны разделить вас дизайн на отдельные сегменты. Каждый сегмент может быть либо отдельным макетом, либо виджетами. В вас, например, я вижу следующие сегменты:

  • Большой красный значок,
  • Две метки: TextLabel и 06-Ноябрь-2014 ...
  • Два этикетки сделать макет вертикальной коробки,
  • Вертикальная компоновка коробки и большой красный значок образуют горизонтальную коробку,
  • Маленький красный прямоугольник делает отдельный макет,
  • Все макеты составляют основной макет.

Теперь давайте код этой композиции:

QLabel *largeRed = new QLabel(this); // Should set an image for this label 
QLabel *lbl1 = new QLabel("06-November-2014...", this); 
QLabel *lbl2 = new QLabel("TextLabel", this); 

QVBoxLayout *vLayout = new QVBoxLayout; 
vLayout->addWidget(lbl1); 
vLayout->addWidget(lbl2); 
vLayout->addStretch(); 

QHBoxLayout *hLayout = new QHBoxLayout; 
hLayout->addWidget(largeRed); 
hLayout->addLayout(vLayout); 

QLabel *smallRed = new QLabel(this); // Should set an image for this label 
QHBoxLayout *hLayout2 = new QHBoxLayout; 
hLayout2->addWidget(smallRed, 0, Qt::AlignRight); 

QVBoxLayout *mainLayout = new QVBoxLayout(this); 
mainLayout->addLayout(hLayout); 
mainLayout->addLayout(hLayout2); 
[..] 
+1

Я поддержал ваш ответ, потому что он требует много времени, и на этот раз его нельзя опустить. Не имеет значения, что я был немного быстрее, потому что все это время вы форматируете свой код, чтобы сделать это лучше. – Chernobyl

+0

Спасибо! это сделало вещи намного яснее. У меня только одна проблема с этим кодом. Как изменить интервал между lbl1 и lbl2. Прямо сейчас между этими двумя ярлыками слишком много места. – testus

+0

@testus, добавьте 'vLayout-> addStretch();' вызовите vLayout. Пожалуйста, ознакомьтесь с обновленным образцом в моем ответе. Он будет содержать две метки вместе. – vahancho

1

Используйте это.

QPixmap big(75,65); 
big.fill(Qt::red); 
QPixmap small(25,15); 

QVBoxLayout *box = new QVBoxLayout; 

QWidget *window = new QWidget; 
QLabel *bigLab = new QLabel; 
QLabel *smallLab = new QLabel; 
QLabel *textLab = new QLabel("Two"); 
bigLab->setPixmap(big); 
smallLab->setPixmap(small); 

QHBoxLayout *hLay = new QHBoxLayout; 
hLay->addWidget(bigLab); 
hLay->addWidget(textLab); 

QHBoxLayout *vLay = new QHBoxLayout; 
vLay->addWidget(smallLab,0,Qt::AlignRight); 

box->addLayout(hLay); 
box->addLayout(vLay); 

window->setLayout(box); 
window->show(); 

Результат:

enter image description here

0

Что я обычно делаю это:

  1. Дизайн макет с Qt Designer/Creator, используя богатые возможности Оформление печатных изданий.
  2. Задайте свои экземпляры (из кода) в качестве виджета элемента виджета списка или таблицы.

Будьте внимательны, если список предметов слишком велик, он будет работать очень медленно.

P.S. Если вам действительно нужна кодировка макета, просто используйте код, созданный дизайнером Qt.

Смежные вопросы