crossplatform.ru

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


  Ответ в Помогите разобраться с отрисовкой виджета
Введите ваше имя
Подтвердите код

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

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


Последние 10 сообщений [ в обратном порядке ]
XpycT Дата 22.7.2009, 18:43
 
Цитата(Litkevich Yuriy @ 22.7.2009, 18:16) *
XpycT, для случая разных отправителей, лучше используй "карту сигналов" QSignalMaper...

Спасибо, добавил в закладки .
Litkevich Yuriy Дата 22.7.2009, 18:16
  XpycT, для случая разных отправителей, лучше используй "карту сигналов" QSignalMaper, я где-то пример на форуме давал, да и в Асистенте он описан достаточно.

П.С. или "отображатель сигналов", или "перенаправитель сигналов", или "коллектор сигналов" не знаю как лучше сказать
XpycT Дата 22.7.2009, 17:52
  твою ж... точно не правильно виджеты создал. Вот что значит невнимательность. :( Спасибо все работает.

Вот только хотел спросить , как правельнее создать одинаковые QObject::connect'ы перебором, если у меня допустим их штук 20. Ведь как я понимаю - не правильно будет их дублировать типа
connect(screen1,SIGNAL(imageBrowse()),this,SLOT(openImage()));
    connect(screen...,SIGNAL(imageBrowse()),this,SLOT(openImage()));
    connect(screen20,SIGNAL(imageBrowse()),this,SLOT(openImage()));

видел макросы типа qobject_cast, qvariant_cast... но не совсем понял как ими пользоваться
ufna Дата 22.7.2009, 17:24
 
Цитата(XpycT @ 22.7.2009, 17:40) *
Пришел к тому с чего начал - вернул диалог обратно в виджет, хоть так работает :unsure:


Лучше доразберись. Изначально поправь конструктор. Потом если все так и не идет, дай код, может еще куда что нить забралось.
kwisp Дата 22.7.2009, 17:23
  ufna,
принимается.
со всяким бывает.
ufna Дата 22.7.2009, 17:15
  kwisp, сорри, тупил. После поста Юрия в доки глянул, понял.

Как то всегда руководствовался правилом - private slot - для внутренних объектов, public slot - для внешних. Изначально как понял, так и делал. Блин )
kwisp Дата 22.7.2009, 16:58
  ufna,
не пойму тебя

приведи свой пример.
вот мой модифицированный
Раскрывающийся текст
    #ifndef _R_
    #define _R_

    #include <QObject>
    #include <QtDebug>
    #include <QtGlobal>

    class Sender: public QObject
    {
        Q_OBJECT
    public:
            Sender(QObject* par=0):QObject(par){ startTimer(1000);}
    signals:
            void sg(); 
    protected:
        void timerEvent(QTimerEvent*)
        {
            emit sg();
        }
    };

    class Rec: public QObject
    {
        Q_OBJECT
    public:
            Rec(QObject* par=0):QObject(par)
            {
                
                Sender* sender__ = new Sender;
                connect(sender__,SIGNAL(sg()),this,SLOT(sl()));
            }
    private slots:
        void sl(){ qDebug()<<__func__;}
    };

    #endif //_R_

или так
Раскрывающийся текст

    #ifndef _R_
    #define _R_

    #include <QObject>
    #include <QtDebug>
    #include <QtGlobal>

    class Sender: public QObject
    {
        Q_OBJECT
    public:
            Sender(QObject* par=0):QObject(par){ startTimer(1000);}
    signals:
            void sg(); 
    protected:
        void timerEvent(QTimerEvent*)
        {
            emit sg();
        }
    };

    class Rec: public QObject
    {
        Q_OBJECT
    public:
            Rec(QObject* par=0):QObject(par)
            {
                
//                Sender* sender__ = new Sender;
//                connect(sender__,SIGNAL(sg()),this,SLOT(sl()));
            }
    Sender* CreateSender(){return new Sender;};
    private slots:
        void sl(){ qDebug()<<__func__;}
    };

    #endif //_R_
////
файл main.cpp
////
#include <QApplication>
#include "rec.h"
int main(int a,char** b)
{
    QApplication app(a,b);
    Rec rec;
    Sender* sender__ = rec.CreateSender();
    QObject::connect(sender__,SIGNAL(sg()),&rec,SLOT(sl()));
    return app.exec();
}


что теперь скажете?

П.С.
что то я сегодня плохо понимаю.
пойду на пляж в волейбол играть.
ufna Дата 22.7.2009, 16:54
 
Цитата
категорически не согласен
сигналы вообще protected и нормально коннектятся.
пример с приватным слотом


ты сам мне приводишь пример, где Sender - член класса Rec. В конструкторе же у Хруста создается новый объект, никак не связанный с изначальным классом: ImageWidget *screen1=new ImageWidget;
И соединяет он этот screen1, а не TestApp::screen1. И доступа к приватному слоту у этого объекта быть не должно.


дополнение:
про this понял
kwisp Дата 22.7.2009, 16:54
  XpycT,
Цитата(XpycT @ 22.7.2009, 17:40) *
С сигналами всеравно не разобрался..

не понял тебя.
на всякий случай напишу.
ты сделал класс членами которого являются ImageWidget screen1,screen2. Заметь это не указатели а объекты.

при вызове конструктора класса они благополучно инициализируются в списке инициализации конструкторами по умолчанию(хоть ты их и не трогаешь явно с++ это делает за тебя)
за тем ты зачем не ясно объявляешь( и инициализируешь из кучи) в конструкторе локальные переменные указетели одноименные с твоими объектами класса ImageWidget* screen1, *screen2.

потом вообще весело ты соединяешь сигнал одного локально видимого динамически созданного обекта screen1 с каким то слотом(не важно каким) надеясь что вызовется сигнал.:)

вариантов поправить эту ошибку много
один из вариантов будет таким:
#include <QtGui>
#include "testapp.h"
#include "ImageWidget.h"

TestApp::TestApp(QWidget *parent)
        :QDialog(parent)
{
    //screen2->loadImage("D:\\21.jpg"); // <<< Если на прямую с конструктора - все работает прекрасно.
    QHBoxLayout *layout =new QHBoxLayout;
    layout->addWidget(&screen1);
    layout->addWidget(&screen2);
    setLayout(layout);

    connect(&screen1,SIGNAL(imageBrowse()),this,SLOT(openImage()));

}
void TestApp::openImage()
{    
    QString fileName = QFileDialog::getOpenFileName(this,tr("Select Image"),
                                       QApplication::applicationDirPath(),
                                       tr("Image Files (*.jpg *.jpeg *.png *.bmp *.gif)"));

          if(fileName.isEmpty())
            return;
          else
              screen1.loadImage(fileName);
}



пробуй теперь.
здесь я оставил объекты ImageWidget как есть а вообще тролли настоятельно рекомендуют создавать виджеты динамически.
Litkevich Yuriy Дата 22.7.2009, 16:52
 
Цитата(ufna @ 22.7.2009, 19:32) *
Слот у тебя приватный, а присоединяешь его к сигналу, поступаемому от чужого класса, никак не связанного с данным. Сделай слот public.
он соеденяет со своим (this) слотом, который этим (this) классом видится. А а сигнал виден всегда, если виден объект.

Цитата(kwisp @ 22.7.2009, 19:30) *
при чем тут слоты?
ты посмотри что написал то?
угу
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 18:46