Russian Qt Forum

Qt => Общие вопросы => Тема начата: Alchazar от Январь 04, 2010, 12:56



Название: Создать н-ое количество групп компонентов на форме
Отправлено: Alchazar от Январь 04, 2010, 12:56
Надо создать Х groupBox-ов с графиками и надписями. Практически они будут одинаковыми кроме информации которую они будут содержать.
Как правильно делать:
функцию или структуру?

Если я правильно понимаю, то для таких вещей надо использовать структуры. Вот только хотелось бы узнать прав ли я.

Вопрос наверно покажется глупым, но хотелось бы всётаки узнать мнение людей с опытом.


Название: Re: Создать н-ое количество групп компонентов на форме
Отправлено: Igors от Январь 04, 2010, 13:25
Надо создать Х groupBox-ов с графиками и надписями. Практически они будут одинаковыми кроме информации которую они будут содержать.
Как правильно делать:
функцию или структуру?

Если я правильно понимаю, то для таких вещей надо использовать структуры. Вот только хотелось бы узнать прав ли я.
Прав, структуру/класс. Управлять из ф-ции намного труднее, будет плодиться много if'ов и.т.п


Название: Re: Создать н-ое количество групп компонентов на форме
Отправлено: ilot от Январь 04, 2010, 13:41
В любых объектно-ориентированных языках для этого используются классы. Создайте собственный тип наследованием от QGroupBox. Во внутренней реализации определяемого класса выполняется вся необходимая вам настройка.
Практически они будут одинаковыми кроме информации которую они будут содержать.
если информации не много, можно передавать как параметры конструктору.



Название: Re: Создать н-ое количество групп компонентов на форме
Отправлено: Alchazar от Январь 08, 2010, 14:10
пробую сделать свой класс, но пока не очень выходит(

получаю ошибку error: expected class-name before '{' token

Код
C++ (Qt)
#ifndef PLOT_BOX_H
#define PLOT_BOX_H
 
#include <QObject>
 
class plot_box : public QGroupBox
{
   Q_OBJECT;
 
   public:
       QString box_name;           // Group box text
       QString current_val;        // Current value
       QString thrsh_val;          // Threshold value
       QString worst_val;          // Worst value
       QString legend_1;           // Legend 1 text
       QString legend_2;           // Legend 2 text
 
       double x_data_1, x_data_2,; // Pointer to x values
       double y_data_1, y_data_2,; // Pointer to y values
       int size;                   // Size of x_data
 
       QString marker_text;        // Marker text
       double marker_val;          // Marker value    
};
 
#endif // PLOT_BOX_H
 
 


Название: Re: Создать н-ое количество групп компонентов на форме
Отправлено: Авварон от Январь 08, 2010, 14:16
#include <QGroupBox>


Название: Re: Создать н-ое количество групп компонентов на форме
Отправлено: Alchazar от Январь 08, 2010, 14:24
Точно, прозевал (

Ещё есть несколько вопросов:
1. А как дальше, писать функцию, которая будет рисовать GroupBox со всеми компонентами на нём, или это не лучшее решение?

2. Как мой полученый  GroupBox положить в verticalLayout? Такой вариант не работает(
Код
C++ (Qt)
       plot_box potc_box;
       potc_box.box_name = "test";
 
       verticalLayout_Main->addWidget(potc_box);
[/s]
Разобрался сам)

3. Пытаюсь искать примеры с классами (что нибуть похожее на то, что я хочу сделать), но пока без результов. Может знаете в каком примере есть что-то похожее?


Название: Re: Создать н-ое количество групп компонентов на форме
Отправлено: ilot от Январь 08, 2010, 15:04
А как дальше, писать функцию, которая будет рисовать GroupBox со всеми компонентами на нём, или это не лучшее решение?
Конструирование лучше делать в конструкторе:
Код:
//PlotBox.h
#ifndef PLOT_BOX_H
#define PLOT_BOX_H

#include <QObject>
#include <QGroupBox>
#include <QLabel>
#include <QLineEdit>

class PlotBox: public QGroupBox{
Q_OBJECT
public:
PlotBox(const QString& title = "", QWidget* pwgt = 0);
~PlotBox(){}
private:
QLabel *m_lblFirst, *m_lblSecond;
QLineEdit *m_leFirst, *m_leSecond;
};
#endif //PLOT_BOX_H

//PlotBox.cpp
#include "PlotBox.h"
#include <QGridLayout>

PlotBox::PlotBox(const QString& title, QWidget* pwgt): QGroupBox(title, pwgt)
{
QGridLayout *pgLayout = new QGridLayout;
pgLayout->addWidget(m_lblFirst = new QLabel(tr("Первое поле:")), 0, 0, Qt::AlignRight);
pgLayout->addWidget(m_lblSecond = new QLabel(tr("Второе поле:")), 1, 0, Qt::AlignRight);
pgLayout->addWidget(m_leFirst = new QLineEdit, 0, 1);
pgLayout->addWidget(m_leSecond = new QLineEdit, 1, 1);
setLayout(pgLayout);
}

//main.cpp
#include <QtGui/QtGui>
#include "PlotBox.h"

int main(int argc, char *argv[])
{
//QCoreApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
QApplication a(argc, argv);
PlotBox w(QObject::tr("Группа элементов"));
w.show();

return a.exec();
}


Название: Re: Создать н-ое количество групп компонентов на форме
Отправлено: Alchazar от Январь 08, 2010, 15:50
Спасибо за пример.
Вот только я не могу понять как передать значения напр в m_lblFirst

Описывая класс я создаю переменные, и мне надо данные из этих переменных использовать в label и т.п.

Здесь создаётся PlotBox и ему задаётся название
Код
C++ (Qt)
PlotBox w(QObject::tr("text"));
Я правильно понимаю?

чтобы поместить PlotBox в verticalLayout_Main
я делаю так:
Код
C++ (Qt)
plot_box *w = new plot_box;
verticalLayout_Main->addWidget(w);

А как сделать, чтобы можно было передавать переменные в класс напр. так:
Код
C++ (Qt)
w->box_name="box name";
?







Название: Re: Создать н-ое количество групп компонентов на форме
Отправлено: ilot от Январь 08, 2010, 16:12
Спасибо за пример.
Вот только я не могу понять как передать значения напр в m_lblFirst
Описывая класс я создаю переменные, и мне надо данные из этих переменных использовать в label и т.п.
ну сделай функции-аксессоры в классе, или передавай как дополнительные параметры конструктору. Дальше все по твоему усмотрению. Например:
Код:
//PlotBox.h
class PlotBox: public QGroupBox{
Q_OBJECT
public:
PlotBox(const QString& title = "", const QString& lblFirst = "",
const QString& lblSecond = "", QWidget* pwgt = 0);
~PlotBox(){}
void setLabel(const QString& lblFirst, const QString& lblSecond){
m_lblFirst->setText(lblFirst);
m_lblSecond->setText(lblSecond);
}
QString getFirstLabel() const {return m_lblFirst->text();}
QString getSecondLabel() const {return m_lblSecond->text();}
private:
QLabel *m_lblFirst, *m_lblSecond;
QLineEdit *m_leFirst, *m_leSecond;
};

//PlotBox.cpp
PlotBox::PlotBox(const QString& title, const QString& lblFirst, const QString& lblSecond, QWidget* pwgt): QGroupBox(title, pwgt)
{
QGridLayout *pgLayout = new QGridLayout;
pgLayout->addWidget(m_lblFirst = new QLabel(lblFirst), 0, 0, Qt::AlignRight);
pgLayout->addWidget(m_lblSecond = new QLabel(lblSecond), 1, 0, Qt::AlignRight);
pgLayout->addWidget(m_leFirst = new QLineEdit, 0, 1);
pgLayout->addWidget(m_leSecond = new QLineEdit, 1, 1);
setLayout(pgLayout);
}

//main.cpp
int main(int argc, char *argv[])
{
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
QApplication a(argc, argv);
PlotBox w(QObject::tr("Группа элементов"), QObject::tr("Первое поле:"), QObject::tr("Второе поле:"));
        //устанавливает новый текст в метках
//w.setLabel(QObject::tr("1 поле:"), QObject::tr("2 поле:"));

w.show();

return a.exec();
}


Название: Re: Создать н-ое количество групп компонентов на форме
Отправлено: Alchazar от Январь 08, 2010, 17:29
Сделал так, но label не создаётся(или не показывается)

Где я тут напортачил?

plot_box.h
Код
C++ (Qt)
class PlotBox: public QGroupBox{
       Q_OBJECT
public:
       PlotBox(const QString& title = "", const QString& lblFirst_text = "",
               QWidget* pwgt = 0);
       ~PlotBox(){}
       void setLabelText(const QString& lblFirst_text)
       {
           label_first->setText(lblFirst_text);
           label_first->setMaximumSize(60, 20);
           label_first->setMinimumSize(60, 20);
       }
       //QString getFirstLabel() const {return m_lblFirst->text();}
      // QString getSecondLabel() const {return m_lblSecond->text();}
private:
       QLabel *label_first;
 
};
 

plot_box.cpp
Код
C++ (Qt)
PlotBox::PlotBox(const QString& title, const QString& lblFirst_text, QWidget* pwgt): QGroupBox(title, pwgt)
{
//****** Horizontal layout Main *******
   QHBoxLayout *horizontalLayout_main;
   horizontalLayout_main = new QHBoxLayout();
   horizontalLayout_main->setObjectName(QString::fromUtf8("horizontalLayout_main"));
 
   //****** Vertical layout info ************
   QVBoxLayout *verticalLayout_info;
   verticalLayout_info = new QVBoxLayout();
   verticalLayout_info->setObjectName(QString::fromUtf8("verticalLayout_info"));
 
   horizontalLayout_main->addLayout(verticalLayout_info);
 
   //****** Curent ************
   QHBoxLayout *horizontalLayout_current;
   horizontalLayout_current = new QHBoxLayout();
   horizontalLayout_current->setObjectName(QString::fromUtf8("horizontalLayout_current"));
 
   horizontalLayout_current->addWidget(label_first = new QLabel(lblFirst_text));
 
   setLayout(horizontalLayout_main);
}
 

main_window.cpp
Код:
        PlotBox *w = new PlotBox;      
        w->setLabelText(QObject::tr("1 sad:"));
        verticalLayout_Main->addWidget(w);


Название: Re: Создать н-ое количество групп компонентов на форме
Отправлено: ilot от Январь 08, 2010, 18:05
Слишком много лейаутов в конструкторе для PlotBox. Устанавливаете для виджета один лейаут:
Код:
setLayout(horizontalLayout_main);
а созданная метка заносится в другой - horizontalLayout_current.

Оставьте только такой код в конструкторе:
Код:
   //****** Curent ************
    QHBoxLayout *horizontalLayout_current = new QHBoxLayout();
    horizontalLayout_current->setObjectName(QString::fromUtf8("horizontalLayout_current"));
    horizontalLayout_current->addWidget(label_first = new QLabel(lblFirst_text));
    setLayout(horizontalLayout_current);


Название: Re: Создать н-ое количество групп компонентов на форме
Отправлено: Alchazar от Январь 11, 2010, 14:10
Вроде с класами что-то получается, но таперь столкнулся с другой проблеммой.
В groupBox я хочу добавить график.
Сам plot добавляю так:

Код
C++ (Qt)
void setPlot(const double &plotMin, const double &plotMax,  const double &plotStep)
       {
           QFont plotFont("Times", 8, QFont::Light);
           plot_data->setCanvasLineWidth(0);
           plot_data->setAxisScale(0, plotMin, plotMax, plotStep);
           plot_data->setAxisFont(0, plotFont);
           plot_data->setMinimumWidth(100);
           plot_data->enableAxis(2,false);
       }

А вот добавить кривую не получается, x_val1 и cur_val1 - массивы, надо указывать их размер, размер равен cur_size1.
Как это сделать?
Код
C++ (Qt)
void setCurve1(const double &x_val1,  const double &cur_val1, const int cur_size1)
       {
           QColor curvColor;
           QColor backGrndCol;
           curvColor.setRgb(153, 51, 255, 250);
           backGrndCol.setRgb(153, 51, 255, 50);
 
           curve_line1->setRenderHint(QwtPlotItem::RenderAntialiased);
 
           curve_backg1->setPen(backGrndCol);
           curve_backg1->setBrush(backGrndCol);
           curve_line1->setPen(curvColor);
 
           curve_line1->setData(x_val1, cur_val1, cur_size1);
           curve_backg1->setData(x_val1, cur_val1, cur_size1);
           curve_line1->attach(plot_data);
           curve_backg1->attach(plot_data);
       }

Уже разобрался :)