crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 0:10