crossplatform.ru

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

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> Помогите разобраться с отрисовкой виджета
XpycT
  опции профиля:
сообщение 22.7.2009, 16:40
Сообщение #21


Студент
*

Группа: Участник
Сообщений: 43
Регистрация: 7.7.2009
Пользователь №: 883

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(kwisp @ 22.7.2009, 15:30) *
самая распространенная ошибка, если не ошибаюсь, людей только что представленных С++. :)


На самом деле с С++ знаком не так давно. До этого сидел только на С#, но т.к. не особо радовало Mono для linux систем, решил перейти на Qt. :)

С сигналами всеравно не разобрался.. в дебаге вроде все прекрасно...после выбора рисунка нормально скалит, выводит зум и путь к рисунку.
Rescaling image.... 
[Zoom 113%] "C:\Documents and Settings\XpycT\Мои документы\404.jpg"
i_fileName = C:\Documents and Settings\XpycT\Мои документы\404.jpg

но рисунок не появляется, и следующий вывод i_fileName возвращает пустую строку.

Пришел к тому с чего начал - вернул диалог обратно в виджет, хоть так работает :unsure:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.7.2009, 16:52
Сообщение #22


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

Цитата(kwisp @ 22.7.2009, 19:30) *
при чем тут слоты?
ты посмотри что написал то?
угу
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 22.7.2009, 16:54
Сообщение #23


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


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 как есть а вообще тролли настоятельно рекомендуют создавать виджеты динамически.

Сообщение отредактировал kwisp - 22.7.2009, 17:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 22.7.2009, 16:54
Сообщение #24


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


Цитата
категорически не согласен
сигналы вообще protected и нормально коннектятся.
пример с приватным слотом


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


дополнение:
про this понял

Сообщение отредактировал ufna - 22.7.2009, 16:56
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 22.7.2009, 16:58
Сообщение #25


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


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();
}


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

П.С.
что то я сегодня плохо понимаю.
пойду на пляж в волейбол играть.

Сообщение отредактировал kwisp - 22.7.2009, 17:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 22.7.2009, 17:15
Сообщение #26


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


kwisp, сорри, тупил. После поста Юрия в доки глянул, понял.

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

Сообщение отредактировал ufna - 22.7.2009, 17:18
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 22.7.2009, 17:23
Сообщение #27


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


ufna,
принимается.
со всяким бывает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 22.7.2009, 17:24
Сообщение #28


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


Цитата(XpycT @ 22.7.2009, 17:40) *
Пришел к тому с чего начал - вернул диалог обратно в виджет, хоть так работает :unsure:


Лучше доразберись. Изначально поправь конструктор. Потом если все так и не идет, дай код, может еще куда что нить забралось.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 22.7.2009, 17:52
Сообщение #29


Студент
*

Группа: Участник
Сообщений: 43
Регистрация: 7.7.2009
Пользователь №: 883

Спасибо сказали: 0 раз(а)




Репутация:   0  


твою ж... точно не правильно виджеты создал. Вот что значит невнимательность. :( Спасибо все работает.

Вот только хотел спросить , как правельнее создать одинаковые 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... но не совсем понял как ими пользоваться
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.7.2009, 18:16
Сообщение #30


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


XpycT, для случая разных отправителей, лучше используй "карту сигналов" QSignalMaper, я где-то пример на форуме давал, да и в Асистенте он описан достаточно.

П.С. или "отображатель сигналов", или "перенаправитель сигналов", или "коллектор сигналов" не знаю как лучше сказать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  < 1 2 3 4 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 13:32