Russian Qt Forum

Qt => Общие вопросы => Тема начата: Yura от Июль 03, 2009, 12:41



Название: не высылается сигнал через emit
Отправлено: Yura от Июль 03, 2009, 12:41
не всегда высылается сигнал
есть конструктор некоторого класса:

Код:
UsersWidget::UsersWidget(QWidget *parent) : QWidget(parent)
{
setupUi(this);

connect(bRefreshUser, SIGNAL(clicked()), SIGNAL(SignalToGetUserList()));
QTimer::singleShot(1, this, SLOT(slotToSendSignal()));
emit SignalToGetUserList();
}

при нажатии на кнопку bRefreshUser или по истечение таймера (1 ms) высылается сигнал SignalToGetUserList();
а если просто писать emit SignalToGetUserList(); , то сигнал не высылается...
помогите разобраться?

______________________________________________________________
Qt 4.5.2, OS: Linux ubuntu, IDE: QDevelop.


Название: Re: не всегда высылается сигнал через emit
Отправлено: kuzulis от Июль 03, 2009, 12:57
эмм.. из ассистента пробовали код: ???
Код:
    class MyWidget : public QWidget
    {
        Q_OBJECT

    public:
        MyWidget();

    signals:
        void buttonClicked();

    private:
        QPushButton *myButton;
    };

    MyWidget::MyWidget()
    {
        myButton = new QPushButton(this);
        connect(myButton, SIGNAL(clicked()),
                this, SIGNAL(buttonClicked()));
    }

т.е Вы забыти оператор this вроде


Название: Re: не всегда высылается сигнал через emit
Отправлено: Авварон от Июль 03, 2009, 12:58
this можно опускать вроде


Название: Re: не всегда высылается сигнал через emit
Отправлено: lit-uriy от Июль 03, 2009, 13:04
>>this можно опускать вроде
Все верно, вот из доки:
Equivalent to connect(sender, signal, this, method, type).


Название: Re: не всегда высылается сигнал через emit
Отправлено: Yura от Июль 03, 2009, 13:07
this можно опускать, когда объект не обрабатывает сигнал, а передаёт его дальше...

connect(bRefreshUser, SIGNAL(clicked()), SIGNAL(SignalToGetUserList())); - работает как надо, т.е. высылает сигнал

Timer::singleShot(1, this, SLOT(slotToSendSignal())); - тоже работает, вызывает слот slotToSendSignal(), который в свою очередь высылает сигнал
Код:
void UsersWidget::slotToSendSignal()
{
emit SignalToGetUserList();
}


если просто пытаюсь выслать сигнал emit SignalToGetUserList(); при создании объекта
допустим так:
Код:
UsersWidget::UsersWidget(QWidget *parent) : QWidget(parent)
{

emit SignalToGetUserList();
}

или так:
Код:
UsersWidget::UsersWidget(QWidget *parent) : QWidget(parent)
{
slotToSendSignal();
}

то ничего не происходит...

может я что-то не понимаю... или просто туплю....


Название: Re: не всегда высылается сигнал через emit
Отправлено: Yura от Июль 03, 2009, 13:12
меня интересует, как при создании объекта сразу выслать сигнал,
я конечно извратился и использовал таймер и слот, но хочется как-то проще...


Название: Re: не всегда высылается сигнал через emit
Отправлено: Yura от Июль 03, 2009, 13:15
>>this можно опускать вроде
Все верно, вот из доки:
Equivalent to connect(sender, signal, this, method, type).

вы видимо не поняли, у меня ситуация: connect(p_sender, SIGNAL(...), SIGNAL(...));
к тому же у меня это работает
меня интересует, как просто выслать сигнал через emit...


Название: Re: не всегда высылается сигнал через emit
Отправлено: Авварон от Июль 03, 2009, 13:16
проектик в студию... странно это, эмит сразу после коннекта работать должен. Точно коннект был до вызова?


Название: Re: не всегда высылается сигнал через emit
Отправлено: kuzulis от Июль 03, 2009, 13:23
а сам сигнал SignalToGetUserList() определен ?


Название: Re: не всегда высылается сигнал через emit
Отправлено: Yura от Июль 03, 2009, 13:25
вот проект:

имеется mainwind:
.cpp
Код:
  ...
  workWithDatabase = new WorkWithDatabase("minienterprise.htm");
  usersWidget = new UsersWidget(this);

  connect(usersWidget, SIGNAL(SignalToGetUserList()), workWithDatabase, SLOT(SlotUsersList()));
  ...

usersWidget.h
Код:
#ifndef __USERSWIDGET_H__
#define __USERSWIDGET_H__

#include <QtGui>

#include "ui_usersWidget.h"

class UsersWidget : public QWidget, public Ui::usersWidget
{
Q_OBJECT

public:
UsersWidget(QWidget *parent=0);


public slots:
  void slotToSendSignal();
 
signals:
void SignalToGetUserList();
};
#endif // __USERSWIDGET_H__

usersWidget.cpp
Код:
#include "usersWidget.h"
 
UsersWidget::UsersWidget(QWidget *parent) : QWidget(parent)
{
setupUi(this);

connect(bRefreshUser, SIGNAL(clicked()), SIGNAL(SignalToGetUserList()));
//QTimer::singleShot(1, this, SLOT(slotToSendSignal()));
//slotToSendSignal();

emit SignalToGetUserList();
}

void UsersWidget::slotToSendSignal()
{
emit SignalToGetUserList();
}


workwithdatabase.h
Код:
class WorkWithDatabase : public QObject 
{
Q_OBJECT
...
public slots:
void SlotUsersList();
...
};

workwithdatabase.cpp
Код:
...
void WorkWithDatabase::SlotUsersList()
{
qDebug()<<"SIGNAL WAS SENDED";
}
...



ещё раз повторюсь
если в конструкторе UsersWidget::UsersWidget(QWidget *parent) : QWidget(parent) выслать emit SignalToGetUserList(); то ничиго не проиходит
а если QTimer::singleShot(1, this, SLOT(slotToSendSignal()));
или нажать на кнопку, то сигнал высылается...


Название: Re: не всегда высылается сигнал через emit
Отправлено: Yura от Июль 03, 2009, 13:28
а сам сигнал SignalToGetUserList() определен ?

конечно, посмотри пример выше ...


Название: Re: не всегда высылается сигнал через emit
Отправлено: denka от Июль 03, 2009, 13:30
Все очень просто у тебя сигнал высылаеться до вызова connect

И еще
this можно опускать, когда объект не обрабатывает сигнал, а передаёт его дальше...
this можно опускать потому что это переопределенный метод, и нет разницы будет он соединен с сигналом или со слотом


Название: Re: не высылается сигнал через emit
Отправлено: lit-uriy от Июль 03, 2009, 13:33
>>у тебя сигнал высылаеться до вызова connect
а где это видно?


Название: Re: не высылается сигнал через emit
Отправлено: denka от Июль 03, 2009, 13:37
>>у тебя сигнал высылаеться до вызова connect
а где это видно?
Вот здесь:
Код:
usersWidget = new UsersWidget(this);

connect(usersWidget, SIGNAL(SignalToGetUserList()), workWithDatabase, SLOT(SlotUsersList()));
создаеться объект и сразу вызывает в конструторе сигнал а потом уже идет конект. Так как таймер срабатывает через секунду, то строчка:
Код:
QTimer::singleShot(1, this, SLOT(slotToSendSignal()));	
работает нормально
 


Название: Re: не всегда высылается сигнал через emit
Отправлено: Yura от Июль 03, 2009, 13:37
Все очень просто у тебя сигнал высылаеться до вызова connect

хм....
а ты ведь прав!
сначала создаётся объект и тут же высылается сигнал...
а только потом connect

Цитировать
И еще
this можно опускать, когда объект не обрабатывает сигнал, а передаёт его дальше...
this можно опускать потому что это переопределенный метод, и нет разницы будет он соединен с сигналом или со слотом
по поводу этого...я процитировал из книги Макс Шлее


Название: Re: не высылается сигнал через emit
Отправлено: Yura от Июль 03, 2009, 13:42
выход нашёл таким:

после connect
вызвал usersWidget->slotToSendSignal();

насчёт таймера, он вызывался через 1 милисекунду, видимо этого времени хватило, чтобы прошла инициализация в connect


Название: Re: не высылается сигнал через emit
Отправлено: Yura от Июль 03, 2009, 13:43
может будут ещё замечания по этой теме?

через пару часов удалю эту тему...



Название: Re: не всегда высылается сигнал через emit
Отправлено: denka от Июль 03, 2009, 13:43
Цитировать
И еще
this можно опускать, когда объект не обрабатывает сигнал, а передаёт его дальше...
this можно опускать потому что это переопределенный метод, и нет разницы будет он соединен с сигналом или со слотом
по поводу этого...я процитировал из книги Макс Шлее
Книгу не читал. Для меня лучшая книга это Assistant :) В принципе на счет конекта можешь проверить сам если мне не веришь или глянуть в справку ;)


Название: Re: не всегда высылается сигнал через emit
Отправлено: Yura от Июль 03, 2009, 13:53
В принципе на счет конекта можешь проверить сам если мне не веришь или глянуть в справку ;)

что здесь ты имеешь ввиду?
я разобрался, что сигнал был выслан раньше коннекта, ты об этом?

ps. само собой без asistant'a "не куда"   :))


Название: Re: не высылается сигнал через emit
Отправлено: lit-uriy от Июль 03, 2009, 13:58
>>создаеться объект и сразу вызывает в конструторе сигнал а потом уже идет конект.
Вот это непонятно.
В конструкторе класса создаётся соединение и, затем(!), посылается сигнал.

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


Название: Re: не высылается сигнал через emit
Отправлено: denka от Июль 03, 2009, 14:07
Я не про соединение в конструкторе. А про это соединение:
Код:
connect(usersWidget, SIGNAL(SignalToGetUserList()), workWithDatabase, SLOT(SlotUsersList()));
Соединение происходит после того как создан объект, то есть после того как отработал конструктор


Название: Re: не всегда высылается сигнал через emit
Отправлено: denka от Июль 03, 2009, 14:16
В принципе на счет конекта можешь проверить сам если мне не веришь или глянуть в справку ;)

что здесь ты имеешь ввиду?
я разобрался, что сигнал был выслан раньше коннекта, ты об этом?

ps. само собой без asistant'a "не куда"   :))
нет я про твою фразу из Шлее
Цитировать
this можно опускать, когда объект не обрабатывает сигнал, а передаёт его дальше...