Название: Сложная компоновка и сложный виджет
Отправлено: AfterEarth от Январь 17, 2011, 18:47
Друзья, выручайте! Проект нужен "ещё вчера", но никак не клеится :( Активно и продуктивно помогшим :) кину денежек на телефон.. :) В общем есть структура виджетов: 1) Основное окно создаваемого виджета (фиксированный размер, VLayuot) а) В нём хидер с картинкой, б) Окно содержимого (виджет) в) Футер (панель инструментов) 2) В окне содержимого: Слева должно быть окно фиксированного размера (содержимое по центру) с двумя кнопками прокрутки вверх и вниз, между ними ScrollArea с виджетами из нескольких виджетов с картинками и текстом в различных местах виджета (менеджеры компоновки не катят - там сложно всё :-/ ). Виджеты в ScroolArea тоже должны быть фиксированного размера Вывод их у меня делается в QVBoxLayout. Справа от этого виджета с кнопками и прокруткой д.б. виджет с текстом на оставшийся размер внутренней части, часть которого меняется в процессе работы с этим всем окном и располагается в указанном месте этого окна. CartForm::CartForm(QDesktopWidget* pwgt /*= 0*/): QWidget(pwgt) { //Base visual elements setObjectName("CartForm"); QRect desktopRect = pwgt->screenGeometry(); QSize size = desktopRect.size(); //* qreal(0.99) move(0,0); resize(size.width(),size.height());
vLayout = new QVBoxLayout (this); this->setLayout(vLayout);
QLabel *banner= new QLabel(this);
vLayout->setContentsMargins(0, 0, 0, 0); banner->setContentsMargins(0,0,0,0); vLayout->setAlignment(Qt::AlignTop); QImage image(":/images/logo_small_cat.jpg"); ... /*Баннер поскипан, он выводится нормально*/ vLayout->addWidget(banner);
order_text = new QLabel(this); .. order_text->setText(QString::fromUtf8("ЗАКАЗАТЬ")); vLayout->setAlignment(Qt::AlignHCenter); vLayout->addWidget(order_text);
/*Содержимое*/ body = new QWidget(this); body->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
/*Компоновка для виджета скроллинга и текстовой области*/ bodyLayout = new QHBoxLayout(); //bodyLayout->setAlignment() body->setLayout(bodyLayout); vLayout->addWidget(body);
/*Футер*/ tbform *toolbar = new tbform(this); toolbar->setFixedSize(this->width(),90); vLayout->addWidget(toolbar);
int allHeight = 0; int h1 = vLayout->totalSizeHint().height(); allHeight += h1; row_count = (int)((size.height() - allHeight - 80) / 113);
int col_count = 0; /*Меняем размер виджета для содержимого с учётом оставшейся высоты*/ body->resize(size.width(),size.height()-allHeight); body->setFixedSize(size.width(),size.height()-allHeight);
/*Добавляем виджет области скроллинга с кнопками*/ scrollWidget = new QWidget(this); bodyLayout->addWidget(scrollWidget);
/*Задаём ему фиксированную ширину*/ scrollWidget->setFixedSize(340,size.height() - allHeight); scrollWidget->resize(340,size.height() - allHeight);
/*Компоновка в нём по вертикали*/ scrollLayout = new QVBoxLayout(); /*Нужно, чтобы кнопки и скроллареа располагались по его центру ^ ------- | | | | ------- `' (кнопка прокрутки вниз) Сейчас эта байда прижимается к левому краю, а сам виджет отстоит от левого края точек на 200-300, хотя у следующего виджета за ним тоже задана ширина :( */ scrollLayout->setAlignment(Qt::AlignHCenter); scrollWidget->setLayout(scrollLayout);
/*Добавил верхнюю кнопку прокрутки*/ upScroll = new QPushButton(this); //this); upScroll->setFixedSize(73,37); upScroll->setIcon(QIcon(":/images/arrowUp.png")); upScroll->setIconSize(QSize(73,37)); upScroll->setFlat(true); scrollLayout->addWidget(upScroll);
/*Добавил скролларию*/ sa = new QScrollArea(this);
scrollAreaLayout = new QVBoxLayout(this); sa->setLayout(scrollAreaLayout); scrollLayout->addWidget(sa); sa->setFrameStyle(QFrame::NoFrame); sa->setFixedSize(340,body->height()-74);
/*Выполнение запроса*/ while (order_query.next()) { QString prod_id = order_query.value(0).toString(); QString prod_name = order_query.value(2).toString(); QString quantity = order_query.value(1).toString();
order_products.append(new order_product(0,prod_id,prod_name,quantity)); /*Это виджет, описанный ниже*/ scrollAreaLayout->addWidget(order_products.last()); }
/*Добавляем нижнюю кнопку*/ downScroll = new QPushButton(this); downScroll->setFixedSize(73,37); downScroll->setIcon(QIcon(":/images/arrowDown.png")); downScroll->setIconSize(QSize(73,37)); downScroll->setFlat(true); scrollLayout->addWidget(downScroll);
order_info_body = new QWidget(this); order_info_body->setObjectName("order_info_body"); /*Размер области для текста*/ order_info_body->resize(body->width()-340,size.height() - allHeight); /*Добавление виджета в горизонтальную компоновку*/ bodyLayout->addWidget(order_info_body);
QLabel *lbl1 = new QLabel(order_info_body); lbl1->setStyleSheet("font-size: 27px; color: #000;"); lbl1->move(120,50); lbl1->setText(QString::fromUtf8("На сумму: ")); QLabel *lbl2 = new QLabel(order_info_body); lbl2->setStyleSheet("font-size: 27px; color: #f00; font-weight: bold;"); lbl2->move(200,50); lbl2->setText(QString::fromUtf8("1250 р")); /*Эти метки не выводились :( */
------------------------------------------------------------------------------------------- Код виджета с картинками и текстом (который должен выводится в ScrollArea) - у него не выводится фон :-/ Фон выводится только на метки внутри него :-/ order_product::order_product(QWidget *parent, QString product_id, QString product_name, QString quantity_str) : QWidget(parent) { QLabel *img_label; QImage img; QImage img2; QLabel *prod_name; QLabel *quantity_label; QLabel *price_label;
this->adjustSize(); this->resize(331,113); this->setFixedSize(331,113); this->setMinimumSize(331,113);
img.load("./images/noimage.png","PNG"); img2 = img.scaledToWidth(75,Qt::SmoothTransformation); img_label = new QLabel(this); img_label->setPixmap(QPixmap::fromImage(img2)); img_label->move(9,6);
quantity = quantity_str; quantity_label = new QLabel(this); quantity_label->setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.508, y1:0, x2:0.503, y2:1, stop:0 rgba(231, 231, 231, 255), stop:1 rgba(226, 226, 226, 255));"); quantity_label->setText(quantity_str); quantity_label->move(254,0);
prod_name = new QLabel(this); prod_name->setText(product_name); prod_name->setFont(QFont ("Arial", 13, QFont::Normal)); prod_name->move(103,38);
price_label = new QLabel(this); price_label->setText("1250.70"); price_label->setFont(QFont ("Arial", 13, QFont::Bold,true)); price_label->setStyleSheet("color: #bd1f33; font-size: 13px; font-style: italic; font-weight: bold;"); price_label->move(103,73);
/*Этот фон не выводится для всего виджета:*/ this->setStyleSheet(QString::fromUtf8("background-color: qlineargradient(spread:pad, x1:0.508, y1:0, x2:0.503, y2:1, stop:0 rgba(0, 0, 0, 255), stop:0.0108108 rgba(119, 119, 119, 255), stop:1 rgba(255, 255, 255, 255)); border-radius: 7px;")); this->setEnabled(true); this->setVisible(true); }
У меня Qt 4.7.0 Заранее очень благодарен за помощь!
Название: Re: Сложная компоновка и сложный виджет
Отправлено: dd от Январь 18, 2011, 12:24
Сложно разобраться, что нужно, сумбурное описание. Проще создать простой проектик с енработающим кодом и выложить, или хотябы скрин. Я так понял с layout -ами не можешь разобраться? Можешь на аську обратиться двести стодвадцатьвосемь семьмот.
Название: Re: Сложная компоновка и сложный виджет
Отправлено: AfterEarth от Январь 24, 2011, 09:26
Я к тебе "стукнулся" с номера: триста восемь четыре семь девять пятьсот восемьдест три-видно меня?
Название: Re: Сложная компоновка и сложный виджет
Отправлено: Пантер от Январь 24, 2011, 09:54
AfterEarth: убери номера, а то заспамят. Такое нужно в личку писать.
Название: Re: Сложная компоновка и сложный виджет
Отправлено: AfterEarth от Январь 26, 2011, 00:56
Поправил, спасибо!
|