Russian Qt Forum
Май 18, 2024, 01:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Табличное расположение QLabel  (Прочитано 8625 раз)
zodiac
Гость
« : Ноябрь 20, 2008, 22:59 »

Необходимо на виджете сделать таблицу из qlabel (т.е. чтобы qlabel выглядели просто ровно). Пробовал через qgridlayout, но он убого это делает. Все куда-то уехжает и т.п. Надо разместить qlabel в n строчек (могут быть пустые места) и в m столбцов. Qlabel 70*100. Как это лучше всего сделать?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Ноябрь 21, 2008, 07:12 »

QGridLayout отлично все делает, читай доки по нему.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kirill
Гость
« Ответ #2 : Ноябрь 21, 2008, 08:21 »

Как вариант использовать QTableWidget
Записан
spirit
Гость
« Ответ #3 : Ноябрь 21, 2008, 09:08 »

да, оптимальнее заюзать QTableWidget, на крайняк QTableView. скорость будет выше, тут я с kirill'ом согласен.
Записан
zodiac
Гость
« Ответ #4 : Ноябрь 21, 2008, 15:08 »

Код:
	QGridLayout *mainLayout = new QGridLayout;
mainLayout->setContentsMargins(1, 1, 1, 1);

element *test1 = new QLabel;
element *test2 = new QLabel;
element *test3 = new QLabel;
element *test4 = new QLabel;

QSpacerItem *spacer = new QSpacerItem(70, 100, QSizePolicy::Fixed);

test1->setText("111");
test2->setText("222");
test3->setText("333");
test4->setText("444");

test1->setStyleSheet("background: white; border: 1px solid black;");
test2->setStyleSheet("background: red; border: 1px solid black;");
test3->setStyleSheet("background: blue; border: 1px solid black;");
test4->setStyleSheet("background: blue; border: 1px solid black;");

test1->setFixedSize(70, 100);
test2->setFixedSize(70, 100);
test3->setFixedSize(70, 100);
test4->setFixedSize(70, 100);

mainLayout->addWidget(test1, 0, 0, 0, 18);
mainLayout->addItem(spacer, 0, 1, 0, 18);
mainLayout->addWidget(test2, 0, 2, 0, 18);
mainLayout->addWidget(test3, 1, 0, 2, 18);
//mainLayout->addWidget(test4, 1, 1, 2, 18);

setLayout(mainLayout);
Ну и где это нормально?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Ноябрь 21, 2008, 15:31 »

Ну и где это нормально?

А что неустраивает? Скрин приложи хоть

ЗЫ: Делал точно такую таблицу на лейблах с использование QGridLayout - проблем никаких
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
zodiac
Гость
« Ответ #6 : Ноябрь 22, 2008, 20:36 »

http://zodiac.egghost.ru/node/28
Во-первых, между qlabel большое расстояние (между строками), а во-вторых, надо бы начинать рисовать с левого верхнего угла. Пробовал делать выравнивание, но они начинают наползать друг на друга. Щас буду пробовать рисовать по координатам.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Ноябрь 22, 2008, 20:43 »

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
zodiac
Гость
« Ответ #8 : Ноябрь 22, 2008, 21:04 »

Если добавить еще qlabel и спейсеры, то второй будет наползать на первый. я так проверял уже. хочу через qpainter рисовать. получится?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Ноябрь 22, 2008, 21:19 »

Про наползание малехо не понял. Спейсеров нужно только 2: снижу и справа. Лично я бы с пайинтером бы незаморачивался, а заюзал бы QTableWidget.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
zodiac
Гость
« Ответ #10 : Ноябрь 22, 2008, 21:21 »

Ну да. два спейсера и два лейбла = наползание второго на первый.
А можно еще как-то изменить место, откуда начинать рисовать qlabel? Без qpainter...
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Ноябрь 22, 2008, 21:47 »

ничего никуда не наползает, пример прикреплен
Записан

Юра.
zodiac
Гость
« Ответ #12 : Ноябрь 22, 2008, 21:50 »

Дык мне надо динамически это рисовать. Меня интересует как можно их по координатам располагать. QLayout не дает юзать setGeometry
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #13 : Ноябрь 22, 2008, 22:32 »

QLayout не дает юзать setGeometry
И правильно делает, установи у виджета политику и, если необходимо, макимальный и минимальный размер.

П.С. теме место в "новичках"
Записан

Юра.
zodiac
Гость
« Ответ #14 : Ноябрь 22, 2008, 23:37 »

Сделал так:
Код:
	QGridLayout *layout = new QGridLayout(this);
QGridLayout *mainLayout = new QGridLayout();
QSpacerItem *horizontalSpacer = new QSpacerItem(geometry().width()-mainLayout->geometry().width(), 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
QSpacerItem *verticalSpacer = new QSpacerItem(20, geometry().height()-mainLayout->geometry().height(), QSizePolicy::Minimum, QSizePolicy::Expanding);

element *test1 = new element(this);
element *test2 = new element(this);
element *test3 = new element(this);
element *test4 = new element(this);

test1->setText("111");
test2->setText("222");
test3->setText("333");
test4->setText("444");

mainLayout->addWidget(test1, 0, 0, 1, 1);
mainLayout->addWidget(test2, 0, 1, 1, 1);
mainLayout->addWidget(test3, 0, 2, 1, 1);
mainLayout->addWidget(test4, 1, 2, 1, 1);

layout->addLayout(mainLayout, 0, 0);


layout->addItem(horizontalSpacer, 0, 1);
layout->addItem(verticalSpacer, 1, 0);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 21.