crossplatform.ru

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


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

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

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


Последние 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 Текстовая версия Сейчас: 28.3.2024, 22:26