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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сложная компоновка и сложный виджет  (Прочитано 3569 раз)
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 Заранее очень благодарен за помощь!
Записан
dd
Гость
« Ответ #1 : Январь 18, 2011, 12:24 »

Сложно разобраться, что нужно, сумбурное описание. Проще создать простой проектик с енработающим кодом и выложить, или хотябы скрин.
Я так понял с layout -ами не можешь разобраться?
Можешь на аську обратиться двести стодвадцатьвосемь семьмот.
« Последнее редактирование: Январь 18, 2011, 12:28 от dd » Записан
AfterEarth
Гость
« Ответ #2 : Январь 24, 2011, 09:26 »

Я к тебе "стукнулся" с номера: триста восемь четыре семь девять пятьсот восемьдест три-видно меня?
« Последнее редактирование: Январь 26, 2011, 00:53 от AfterEarth » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #3 : Январь 24, 2011, 09:54 »

AfterEarth: убери номера, а то заспамят. Такое нужно в личку писать.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
AfterEarth
Гость
« Ответ #4 : Январь 26, 2011, 00:56 »

Поправил, спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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