crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Идеологически верный выбор инструментов.
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Obey-Kun Дата 3.4.2010, 4:11
 
Цитата
при таком подходе тебе нужно будет сделать видимым объявление перечисления внутри класса дочернего объекта.

Так ведь в любом случае надо делать объявление перечисления видимым как минимум в MainWindow (он испускает сигнал) и во Вью (там слот).

У меня enum объявлен в файле с константнами, типа того:
Раскрывающийся текст

#pragma once
#ifndef QFGUI_QFROST_H
#define QFGUI_QFROST_H

namespace qfgui
{

struct QFrost {
    public:
    /**
     * Расстояние в единицах сцены между узлами сетки,
     * ставится в соответствие одной единице чертежа (безотносительно реальных
     * единиц измерения).
     * @warning не следует путать сетку с видимой сеткой!
     */
    static const unsigned int unitsInGridStep = 10;

    /// Сколько метров в одной единице чертежа
    static const double metersInUnit;

    /// Перечисление типов инструментов
    enum ToolType {
        /// Создавалка ячеек
        cell_creator,
        /// Создавал граничных условий
        boundary_creator,
        /// Прямоугольное выделение
        rectangle_selection,
        /// Эллиптическое выделение
        ellipse_selection
    };
};

}

#endif // QFGUI_QFROST_H



Ну а файл с константами подключается там, где надо. Так что не страшно.

Кстати, всё почему-то заработало без ковыряния с Q_ENUMS.
Litkevich Yuriy Дата 3.4.2010, 4:03
  при таком подходе тебе нужно будет сделать видимым объявление перечисления внутри класса дочернего объекта.
Инкапсуляция похоронена заживо. А самое главное - похоронена концепция компонентного подхода (предоставляемая сигналами и слотами), т.к. компонент стал жёстко зависеть от конкретного includ'а

можно конечно отказатся от объявления в сигнале и слоте перечисления и использовать int, но тогда контроль области определения функции (диаппазона изменения int'а) будешь делать своими глазами
Obey-Kun Дата 3.4.2010, 3:56
 
Цитата
ну слот - функция, просто в отличие от функции-члена класса с ним можно связать сигнал.

Да я знаю. Просто по-хорошему в моём случае слот можно сделать приватным и коннектить к нему сигнал пэрента в конструкторе. Это ради нормальной инкапсуляции и всё такое.
Litkevich Yuriy Дата 3.4.2010, 3:46
 
Цитата(Obey-Kun @ 3.4.2010, 7:28) *
тогда слот придётся делать публичным... так точно обычно делают?
ну слот - функция, просто в отличие от функции-члена класса с ним можно связать сигнал.
А часть функций реализуют публичное API класса.
Например:
QLabel::setText() - открытый слот
Obey-Kun Дата 3.4.2010, 3:28
 
Цитата
вообще соединять в дочернем объекте сигнал родителя - плохая идея, т.к., как минимум, при чтении кода, сначала читается код верхнего, по иерархии, объекта. И лишь при возникновении непонимания лезишь внутрь дочернего.
Поэтому такое соединение нужно делать в родительском объекте.

Вот-вот :). Теперь всегда буду так делать.

но с другой стороны, тогда слот придётся делать публичным... так точно обычно делают?
Litkevich Yuriy Дата 3.4.2010, 3:26
  мало того объявления родительского сигнала в дочернем объекте не видно, обычно. Наверное это и есть причина ошибки. Дело в том, что компилятор не контролирует соединение
Obey-Kun Дата 3.4.2010, 3:26
  Экспериментировал. В MainWindow было:
    area = new Area;
    scene = new Scene;
    area->setScene(scene);
    setCentralWidget(area);


Ясен пень, что connect(parent, SIGNAL(signalToolChosen(QFrost::ToolType)), SLOT(slotSetTool(QFrost::ToolType))); в конструкторе Area как надо не работало, ведь создавалось оно без родительского виджета, а потом уже он назначался. Исправил на:
    area = new Area(this);
    scene = new Scene;
    area->setScene(scene);
    setCentralWidget(area);

Разумеется, всё заработало.
Litkevich Yuriy Дата 3.4.2010, 3:24
 
Цитата(Obey-Kun @ 3.4.2010, 7:17) *
QObject::connect: Cannot connect (null)::signalToolC...
проблему выделил жирным. Т.е. неизвестно какому классу принадлежит функция

Цитата(Obey-Kun @ 3.4.2010, 7:17) *
connect(parent, SIGNAL(signalToolChosen(QFrost::ToolType)),
SLOT(slotSetTool(QFrost::ToolType)));
вообще соединять в дочернем объекте сигнал родителя - плохая идея, т.к., как минимум, при чтении кода, сначала читается код верхнего, по иерархии, объекта. И лишь при возникновении непонимания лезишь внутрь дочернего.
Поэтому такое соединение нужно делать в родительском объекте.
Obey-Kun Дата 3.4.2010, 3:17
  я балбес, декларэйшн не написал
теперь заработало

и я не свой объект передаю, а енумную фигню

спасибо

Кстати, правлильная ошибка из-за отсутствия соответствующих макросов выглядит примерно так:
QObject::connect: Cannot connect (null)::signalToolChosen(QFrost::ToolType) to qfgui::Area::slotSetTool(QFrost::ToolType)

:)

добавил Q_ENUMS(QFrost::ToolType) после макроса Q_OBJECT в хедерах классов, где енум надо использовать в системе сигналов-слотов, но это не помогло... как надо-то? :(

странно...

смотрите, сейчас сделано так:
Area::Area(MainWindow* parent)    : QGraphicsView(parent),
    //...
{
    //...

    connect(parent, SIGNAL(signalToolChosen(QFrost::ToolType)),
            SLOT(slotSetTool(QFrost::ToolType)));
}


И ругается
QObject::connect: Cannot connect (null)::signalToolChosen(QFrost::ToolType) to qfgui::Area::slotSetTool(QFrost::ToolType)


Если заставить этот connect выполняться попозже, то всё ок, коннект проходит и всё работает.
Есть идеи?
Litkevich Yuriy Дата 3.4.2010, 2:22
  вообще-то ошибки компиляции быть не должно, просто соединение может не установиться.
Покажи полностью объявление класса, в котором объявлен слот pickInstrument

вообще существуем много всяких примочек в Qt, чтобы зарегестрировать свои типы данных:
Q_ENUMS
Q_DECLARE_METATYPE
qRegisterMetaType()
...
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 14.4.2021, 19:52