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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создать н-ое количество групп компонентов на форме  (Прочитано 6964 раз)
Alchazar
Гость
« : Январь 04, 2010, 12:56 »

Надо создать Х groupBox-ов с графиками и надписями. Практически они будут одинаковыми кроме информации которую они будут содержать.
Как правильно делать:
функцию или структуру?

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Январь 04, 2010, 13:25 »

Надо создать Х groupBox-ов с графиками и надписями. Практически они будут одинаковыми кроме информации которую они будут содержать.
Как правильно делать:
функцию или структуру?

Если я правильно понимаю, то для таких вещей надо использовать структуры. Вот только хотелось бы узнать прав ли я.
Прав, структуру/класс. Управлять из ф-ции намного труднее, будет плодиться много if'ов и.т.п
Записан
ilot
Гость
« Ответ #2 : Январь 04, 2010, 13:41 »

В любых объектно-ориентированных языках для этого используются классы. Создайте собственный тип наследованием от QGroupBox. Во внутренней реализации определяемого класса выполняется вся необходимая вам настройка.
Практически они будут одинаковыми кроме информации которую они будут содержать.
если информации не много, можно передавать как параметры конструктору.

Записан
Alchazar
Гость
« Ответ #3 : Январь 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
 
 
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Январь 08, 2010, 14:16 »

#include <QGroupBox>
Записан
Alchazar
Гость
« Ответ #5 : Январь 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. Пытаюсь искать примеры с классами (что нибуть похожее на то, что я хочу сделать), но пока без результов. Может знаете в каком примере есть что-то похожее?
« Последнее редактирование: Январь 08, 2010, 14:53 от Alchazar » Записан
ilot
Гость
« Ответ #6 : Январь 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();
}
Записан
Alchazar
Гость
« Ответ #7 : Январь 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";
?





« Последнее редактирование: Январь 08, 2010, 16:04 от Alchazar » Записан
ilot
Гость
« Ответ #8 : Январь 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();
}
Записан
Alchazar
Гость
« Ответ #9 : Январь 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);
Записан
ilot
Гость
« Ответ #10 : Январь 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);
Записан
Alchazar
Гость
« Ответ #11 : Январь 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);
       }

Уже разобрался Улыбающийся
« Последнее редактирование: Январь 11, 2010, 17:33 от Alchazar » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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