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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с добавлением Frame  (Прочитано 3974 раз)
couatl
Гость
« : Март 30, 2009, 23:19 »

Создаю приложение. Пока на стадии разработки дизайна.
Уровень знания: начинающий в Qt. Изучаю по "Qt 4 программирование GUI на С++"

Дизайн создаю в коде.
Создал несколько виджетов (лэйблы, эдиты и кнопки), расположил их с помощью менеджеров компоновки. Получил шапку формы. Под это все внизу хотел вставить виджет-рамку (frame) для того, чтобы на ней потом рисовать. Осуществляю добавление рамки через менеджер компоновки (вертикальный), но рамка не появляется.

main.cpp
Код:
#include <QApplication>
#include "mainDialog.h"

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  mainDialog *dialog = new mainDialog;
  dialog->show();
  return app.exec();
}

mainDialog.h
Код:
#ifndef MAINDIALOG_H // предотвращение многочисленного включения этого заголовочного файла в программу
#define MAINDIALOG_H

#include <QDialog>

class QLabel;
class QLineEdit;
class QPushButton;
class QFrame;

class mainDialog : public QDialog // определяем FindDialog как подкласс QDialog
{
  Q_OBJECT // макрос, который необходимо задавать в начале определения любого класса, содержащего сигналы и слоты
  public:
    mainDialog(QWidget *parent = 0); // конструктор, в параметре parent указывается родительский виджет
  //signals: // секция для объявления сигналов
  //private slots: // секция для объявления закрытых слотов
  private:
//////// Label ////////
    QLabel *titleZoomLabel;
    QLabel *titleTurnLabel;
    QLabel *titleTransferLabel;

    QLabel *centerZoomLabel;
    QLabel *centerTurnLabel;
    QLabel *vectorTransferLabel;

    QLabel *coefficientsZoomLabel;
    QLabel *angleTurnLabel;

    QLabel *xCenterZoomLabel;
    QLabel *yCenterZoomLabel;

    QLabel *xCenterTurnLabel;
    QLabel *yCenterTurnLabel;

    QLabel *xVectorTransferLabel;
    QLabel *yVectorTransferLabel;

    QLabel *xCoefficientsZoomLabel;
    QLabel *yCoefficientsZoomLabel;

//////// LineEdit ////////
    QLineEdit *xCenterZoomEdit;
    QLineEdit *yCenterZoomEdit;

    QLineEdit *xCenterTurnEdit;
    QLineEdit *yCenterTurnEdit;

    QLineEdit *xVectorTransferEdit;
    QLineEdit *yVectorTransferEdit;

    QLineEdit *xCoefficientsZoomEdit;
    QLineEdit *yCoefficientsZoomEdit;

    QLineEdit *angleTurnEdit;

//////// PushButton ////////
    QPushButton *enterZoomButton;
    QPushButton *enterTurnButton;
    QPushButton *enterTransferButton;

    QPushButton *backButton;
    QPushButton *againButton;

//////// Frame ////////
    QFrame *paintFrame;
   
};

#endif

mainDialog.cpp
Код:
#include <QtGui> 

#include "mainDialog.h"

mainDialog::mainDialog(QWidget *parent) : QDialog(parent) // конструктору базового класса передается указатель на родительский виджет
{
//////// new Label ////////
  titleZoomLabel = new QLabel(tr("Zoom"));
  titleTurnLabel = new QLabel(tr("Turn"));
  titleTransferLabel = new QLabel(tr("Transfer"));

  centerZoomLabel = new QLabel(tr("Center Zoom"));
  centerTurnLabel = new QLabel(tr("Center Turn"));
  vectorTransferLabel = new QLabel(tr("Vector Transfer"));

  coefficientsZoomLabel = new QLabel(tr("Coefficients Zoom"));
  angleTurnLabel = new QLabel(tr("Angle Turn"));

  xCenterZoomLabel = new QLabel(tr("X:"));
  yCenterZoomLabel = new QLabel(tr("Y:"));

  xCenterTurnLabel = new QLabel(tr("X:"));
  yCenterTurnLabel = new QLabel(tr("Y:"));

  xVectorTransferLabel = new QLabel(tr("X:"));
  yVectorTransferLabel = new QLabel(tr("Y:"));

  xCoefficientsZoomLabel = new QLabel(tr("for X:"));
  yCoefficientsZoomLabel = new QLabel(tr("for Y:"));

//////// new LineEdit ////////
  xCenterZoomEdit = new QLineEdit;
  yCenterZoomEdit = new QLineEdit;

  xCenterTurnEdit = new QLineEdit;
  yCenterTurnEdit = new QLineEdit;

  xVectorTransferEdit = new QLineEdit;
  yVectorTransferEdit = new QLineEdit;

  xCoefficientsZoomEdit = new QLineEdit;
  yCoefficientsZoomEdit = new QLineEdit;

  angleTurnEdit = new QLineEdit;

//////// new PushButton ////////
  enterZoomButton = new QPushButton(tr("Enter Zoom"));
  enterTurnButton = new QPushButton(tr("Enter Turn"));
  enterTransferButton = new QPushButton(tr("Enter Transfer"));

  backButton = new QPushButton(tr("Back Image"));
  againButton = new QPushButton(tr("Again Image"));

//////// new Frame ////////
  paintFrame = new QFrame;

//////// new HLayout ////////
  QHBoxLayout *CenterZoomLayout = new QHBoxLayout;
    CenterZoomLayout->addWidget(xCenterZoomLabel);
    CenterZoomLayout->addWidget(xCenterZoomEdit);
    CenterZoomLayout->addWidget(yCenterZoomLabel);
    CenterZoomLayout->addWidget(yCenterZoomEdit);
  QHBoxLayout *CenterTurnLayout = new QHBoxLayout;
    CenterTurnLayout->addWidget(xCenterTurnLabel);
    CenterTurnLayout->addWidget(xCenterTurnEdit);
    CenterTurnLayout->addWidget(yCenterTurnLabel);
    CenterTurnLayout->addWidget(yCenterTurnEdit);
  QHBoxLayout *VectorTransferLayout = new QHBoxLayout;
    VectorTransferLayout->addWidget(xVectorTransferLabel);
    VectorTransferLayout->addWidget(xVectorTransferEdit);
    VectorTransferLayout->addWidget(yVectorTransferLabel);
    VectorTransferLayout->addWidget(yVectorTransferEdit);
  QHBoxLayout *CoefficientsZoomLayout = new QHBoxLayout;
    CoefficientsZoomLayout->addWidget(xCoefficientsZoomLabel);
    CoefficientsZoomLayout->addWidget(xCoefficientsZoomEdit);
    CoefficientsZoomLayout->addWidget(yCoefficientsZoomLabel);
    CoefficientsZoomLayout->addWidget(yCoefficientsZoomEdit);

//////// new VLayout ////////
  QVBoxLayout *Vertical1Layout = new QVBoxLayout;
    Vertical1Layout->addWidget(titleZoomLabel);
    Vertical1Layout->addWidget(centerZoomLabel);
    Vertical1Layout->addLayout(CenterZoomLayout);
    Vertical1Layout->addWidget(coefficientsZoomLabel);
    Vertical1Layout->addLayout(CoefficientsZoomLayout);
    Vertical1Layout->addWidget(enterZoomButton);
  QVBoxLayout *Vertical2Layout = new QVBoxLayout;
    Vertical2Layout->addWidget(titleTurnLabel);
    Vertical2Layout->addWidget(centerTurnLabel);
    Vertical2Layout->addLayout(CenterTurnLayout);
    Vertical2Layout->addWidget(angleTurnLabel);
    Vertical2Layout->addWidget(angleTurnEdit);
    Vertical2Layout->addWidget(enterTurnButton);
  QVBoxLayout *Vertical3Layout = new QVBoxLayout;
    Vertical3Layout->addWidget(titleTransferLabel);
    Vertical3Layout->addWidget(vectorTransferLabel);
    Vertical3Layout->addLayout(VectorTransferLayout);
    Vertical3Layout->addStretch();
    Vertical3Layout->addWidget(enterTransferButton);
  QVBoxLayout *Vertical4Layout = new QVBoxLayout;
    Vertical4Layout->addWidget(backButton);
    Vertical4Layout->addWidget(againButton);
    Vertical4Layout->addStretch();

//////// top HLayout ////////
  QHBoxLayout *topLayout = new QHBoxLayout;
    topLayout->addLayout(Vertical1Layout);
    topLayout->addLayout(Vertical2Layout);
    topLayout->addLayout(Vertical3Layout);
    topLayout->addLayout(Vertical4Layout);

//////// main VLayout ////////
  QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addLayout(topLayout);
    mainLayout->addWidget(paintFrame);
  setLayout(mainLayout); // устанавливаем главный менеджер упаковки
}

Выглядит это так:


А рамки нет.
Возможно кто знает в чем проблема.
Заранее благодарю.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #1 : Март 31, 2009, 00:11 »

Вам нужно задать политику размеров и указать минимальные размеры...

Попробуйте так:

Код:
frame->setMinimumHeight(100);
frame->setFrameStyle(QFrame::Panel | QFrame::Raised);
frame->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
couatl
Гость
« Ответ #2 : Март 31, 2009, 16:30 »

shapoclak, спасибо.
Достаточно было:
Код:
frame->setMinimumHeight(100);
или
Код:
frame->setFixedHeight(100);

До написания этого топика, пробовал resize(), но не удавалось.

Проблема решена.
Но интересует, почему понадобился такой подход и почему resize() не помог?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #3 : Март 31, 2009, 19:52 »

Цитировать
Но интересует, почему понадобился такой подход и почему resize() не помог?

Когды ва кладёте виджет в лайот то за то, какие размеры ему придать отвечает ваш менеджер компоновки, вы лишь можете указать ему с помощью метода setSizePolicy как предпочтительнее поступать... resize() будет работать если вы отказываетесь от лайотов.
Примерно так  Крутой
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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