Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: couatl от Март 30, 2009, 23:19



Название: Проблемы с добавлением Frame
Отправлено: 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); // устанавливаем главный менеджер упаковки
}

Выглядит это так:
(http://lh4.ggpht.com/_3-KNyrxybmA/SdEnNTHhkZI/AAAAAAAAAbA/bmC4GFwB6Fk/s800/screen.jpeg)

А рамки нет.
Возможно кто знает в чем проблема.
Заранее благодарю.


Название: Re: Проблемы с добавлением Frame
Отправлено: m_ax от Март 31, 2009, 00:11
Вам нужно задать политику размеров и указать минимальные размеры...

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

Код:
frame->setMinimumHeight(100);
frame->setFrameStyle(QFrame::Panel | QFrame::Raised);
frame->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);


Название: Re: Проблемы с добавлением Frame
Отправлено: couatl от Март 31, 2009, 16:30
shapoclak, спасибо.
Достаточно было:
Код:
frame->setMinimumHeight(100);
или
Код:
frame->setFixedHeight(100);

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

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


Название: Re: Проблемы с добавлением Frame
Отправлено: m_ax от Март 31, 2009, 19:52
Цитировать
Но интересует, почему понадобился такой подход и почему resize() не помог?

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