Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt4] Сложная компоновка и сложный виджет, Проблемы с компоновкой и фоном виджета 
:(
    Опции темы
AfterEarth
Дата 17.1.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.1.2011

Репутация: нет
Всего: нет



Друзья, выручайте!
Проект нужен "ещё вчера", но никак не клеится :( Активно и продуктивно помогшим smile кину денежек на телефон.. smile
В общем есть структура виджетов:
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 Заранее очень благодарен за помощь!
PM MAIL   Вверх
Sartorius
Дата 17.1.2011, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: нет
Всего: 37



Я в код особо не вчитывался... Может вместо layout-ов использовать QGraphicsView в качестве контейнера виджетов, раз есть проблемы с размещением. Там руками сможешь все прописать в деталях
PM MAIL ICQ   Вверх
AfterEarth
Дата 17.1.2011, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.1.2011

Репутация: нет
Всего: нет



Цитата(Sartorius @ 17.1.2011,  18:56)
Я в код особо не вчитывался... Может вместо layout-ов использовать QGraphicsView в качестве контейнера виджетов, раз есть проблемы с размещением. Там руками сможешь все прописать в деталях

Там-же у меня и кнопки и другие виджеты - он их поддерживает в себе? И как-там всё это размещать тогда?
PM MAIL   Вверх
Sartorius
Дата 17.1.2011, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: нет
Всего: 37



Поддерживает...

Код

    QGraphicsScene * sceen = new QGraphicsScene(0, 0, 200, 200);
    QGraphicsView * gv = new QGraphicsView(sceen);

    gv->show();

    QPushButton * btn = new QPushButton("Click");
    QGraphicsProxyWidget * pbtn = sceen->addWidget(btn);
    btn->show();
    btn->setGeometry(10, 10, 100, 100);


кнопка с координатами 10, 10. шириной, высотой = 100.
Можешь Transformation-ы применять к виджетам в GraphicsView. Функциональность сохраняется


PM MAIL ICQ   Вверх
AfterEarth
Дата 17.1.2011, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.1.2011

Репутация: нет
Всего: нет



Ну попробую сейчас, надеюсь поможет smile А что с фоном у виджета делать? :-/
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.