Russian Qt Forum
Ноябрь 26, 2024, 01:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: не высылается сигнал через emit  (Прочитано 12750 раз)
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.
« Последнее редактирование: Июль 03, 2009, 13:30 от Yura » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Июль 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 вроде
Записан

ArchLinux x86_64 / Win10 64 bit
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Июль 03, 2009, 12:58 »

this можно опускать вроде
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Июль 03, 2009, 13:04 »

>>this можно опускать вроде
Все верно, вот из доки:
Equivalent to connect(sender, signal, this, method, type).
Записан

Юра.
Yura
Гость
« Ответ #4 : Июль 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();
}

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

может я что-то не понимаю... или просто туплю....
« Последнее редактирование: Июль 03, 2009, 13:10 от Yura » Записан
Yura
Гость
« Ответ #5 : Июль 03, 2009, 13:12 »

меня интересует, как при создании объекта сразу выслать сигнал,
я конечно извратился и использовал таймер и слот, но хочется как-то проще...
« Последнее редактирование: Июль 03, 2009, 13:15 от Yura » Записан
Yura
Гость
« Ответ #6 : Июль 03, 2009, 13:15 »

>>this можно опускать вроде
Все верно, вот из доки:
Equivalent to connect(sender, signal, this, method, type).

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

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Июль 03, 2009, 13:16 »

проектик в студию... странно это, эмит сразу после коннекта работать должен. Точно коннект был до вызова?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Июль 03, 2009, 13:23 »

а сам сигнал SignalToGetUserList() определен ?
Записан

ArchLinux x86_64 / Win10 64 bit
Yura
Гость
« Ответ #9 : Июль 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()));
или нажать на кнопку, то сигнал высылается...
Записан
Yura
Гость
« Ответ #10 : Июль 03, 2009, 13:28 »

а сам сигнал SignalToGetUserList() определен ?

конечно, посмотри пример выше ...
Записан
denka
Гость
« Ответ #11 : Июль 03, 2009, 13:30 »

Все очень просто у тебя сигнал высылаеться до вызова connect

И еще
this можно опускать, когда объект не обрабатывает сигнал, а передаёт его дальше...
this можно опускать потому что это переопределенный метод, и нет разницы будет он соединен с сигналом или со слотом
« Последнее редактирование: Июль 03, 2009, 13:34 от den'ka » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Июль 03, 2009, 13:33 »

>>у тебя сигнал высылаеться до вызова connect
а где это видно?
Записан

Юра.
denka
Гость
« Ответ #13 : Июль 03, 2009, 13:37 »

>>у тебя сигнал высылаеться до вызова connect
а где это видно?
Вот здесь:
Код:
usersWidget = new UsersWidget(this);

connect(usersWidget, SIGNAL(SignalToGetUserList()), workWithDatabase, SLOT(SlotUsersList()));
создаеться объект и сразу вызывает в конструторе сигнал а потом уже идет конект. Так как таймер срабатывает через секунду, то строчка:
Код:
QTimer::singleShot(1, this, SLOT(slotToSendSignal()));	
работает нормально
 
Записан
Yura
Гость
« Ответ #14 : Июль 03, 2009, 13:37 »

Все очень просто у тебя сигнал высылаеться до вызова connect

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

Цитировать
И еще
this можно опускать, когда объект не обрабатывает сигнал, а передаёт его дальше...
this можно опускать потому что это переопределенный метод, и нет разницы будет он соединен с сигналом или со слотом
по поводу этого...я процитировал из книги Макс Шлее
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 22.