crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> сигналы слоты __ запутался
__ilya__
  опции профиля:
сообщение 22.6.2012, 18:22
Сообщение #1


Студент
*

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

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




Репутация:   0  


есть два класса TextEdit and PushBox объект последнего находится в первом.
в классе PushBox есть кнопка del, при ее нажатии в классе TextEdit должен вызыватся слот clear(). НО не фига не получается.
Qt запутанная какаято не как не вкурю вот код подскажите как надо

#include <QtGui/QApplication>
#include "textedit.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    TextEdit w;

    w.resize(400, 600);
    w.show();
    
    return a.exec();
}




#ifndef TEXTEDIT_H
#define TEXTEDIT_H

#include <QtGui/QWidget>
#include <QtGui>

class PushBox:public QWidget
{
    Q_OBJECT

protected:
    QPushButton *p1;
    QPushButton *del;
    QPushButton *quit;
    QHBoxLayout *pH;

public:
    PushBox(QWidget *p = 0);
};

class TextEdit : public QWidget
{
    Q_OBJECT
    
public:
    TextEdit(QWidget *parent = 0);
    //~TextEdit();
private:
    QVBoxLayout *pV; // = new QVBoxLayout;  ERROR
    QLabel      *plbl;
    QTextEdit   *pte;
    PushBox     *pPB;
};

#endif // TEXTEDIT_H



#include "textedit.h"

TextEdit::TextEdit(QWidget *parent)
    : QWidget(parent)
{
    plbl = new QLabel("       TEXT EDIT");
    pte = new QTextEdit;
    pPB = new PushBox;

    //connect(PushBox::quit, SIGNAL(clicked()), pte, SLOT(clear()));

    //SetLayout
    pV = new QVBoxLayout;
    pV->addWidget(plbl);
    pV->addWidget(pte);
    pV->addWidget(pPB);
    this->setLayout(pV);
}

/*TextEdit::~TextEdit()
{
    
}*/
PushBox::PushBox(QWidget *p)
{
    p1 = new QPushButton("1");
    del = new QPushButton("Delete");
    quit = new QPushButton("Quit");

    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
    connect(del, SIGNAL(clicked()), TextEdit::pte, SLOT(clear()));

    // Layout
    pH = new QHBoxLayout;
    pH->addWidget(p1);
    pH->addWidget(del);
    pH->addWidget(quit);
    this->setLayout(pH);
}


я уже и так и эдак пробовал.
я так думаю у класса PushBox должен быть свой сигнал (в смысле пользовательский), но как его сотварить???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
__ilya__
  опции профиля:
сообщение 22.6.2012, 20:01
Сообщение #2


Студент
*

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

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




Репутация:   0  


чем больше читаю про сигналы-слоты, тем больше запутываюсь
что это? обмен данными в глобальном пространстве?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 23.6.2012, 12:54
Сообщение #3


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

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

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




Репутация:   3  


Цитата
connect(del, SIGNAL(clicked()), TextEdit::pte, SLOT(clear()));

pte не статический член, надо передать в PushBox указатель pte и тогда вы сможете провести connect.
Цитата
обмен данными в глобальном пространстве?

Нет.
Цитата
я так думаю у класса PushBox должен быть свой сигнал (в смысле пользовательский), но как его сотварить???

В данном случае необязательно, хотя это конечно избавило бы от необходимости передавать pte. Сделать очень просто:
в классе:
class PushBox:public QWidget
{
    Q_OBJECT
...
...
...
signals:
    void OwnSignal();
};

в коде:
emit OwnSignal(); //вызов сигнала
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 23.6.2012, 13:42
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(__ilya__ @ 22.6.2012, 23:01) *
обмен данными в глобальном пространстве?


можно и так сказать, но с тем отличием, что "зов" услышат только подписавшиеся на него объекты :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
__ilya__
  опции профиля:
сообщение 24.6.2012, 11:33
Сообщение #5


Студент
*

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

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




Репутация:   0  


Цитата
В данном случае необязательно, хотя это конечно избавило бы от необходимости передавать pte. Сделать очень просто:
в классе:
class PushBox:public QWidget
{
Q_OBJECT
...
...
...
signals:
void OwnSignal();
};

в коде:
emit OwnSignal(); //вызов сигнала


а при каком событии будет высылатся сигнал? чем это определяется?
что бы лучше я понял подскажите пожалуйста:
в классе PushBox у меня, определено три кнопки
QPushButton *p1;
QPushButton *del;
QPushButton *quit;

как сделать чтоб при нажатии на каждую высылался свой сигнал? то есть надо определить три пользовательских сигнала. как их связать, каждый со своей кнопкой?.
приведите пример с куском кода
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 24.6.2012, 16:15
Сообщение #6


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

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

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




Репутация:   3  


Цитата
в классе PushBox у меня, определено три кнопки
QPushButton *p1;
QPushButton *del;
QPushButton *quit;

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

Если свои сигналы не должны передавать какие-либо данные, то вот так проще всего:
connect(p1, SIGNAL(clicked()), this, SIGNAL(MySignal1()));
connect(del, SIGNAL(clicked()), this, SIGNAL(MySignal2()));
connect(quit, SIGNAL(clicked()), this, SIGNAL(MySignal3()));

Если же хотите передавать данные через свои сигналы, то придеться переопределять события мыши (mousePressEvent или mouseReleaseEvent) или же ставить фильтр событий. И в обработчике фильтра или события писать:
emit MySignal();
http://qt-project.org/doc/qt-4.8/eventsandfilters.html
http://qt-project.org/doc/qt-4.8/qobje...tallEventFilter

Сообщение отредактировал ilyabvt - 24.6.2012, 16:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
__ilya__
  опции профиля:
сообщение 24.6.2012, 16:50
Сообщение #7


Студент
*

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

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




Репутация:   0  


ilyabvt, а MySignal1,2,3 както определять, объявлять не надо?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 25.6.2012, 0:22
Сообщение #8


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

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

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




Репутация:   3  


Цитата
ilyabvt, а MySignal1,2,3 както определять, объявлять не надо?

Объявлять надо (я выше показывал пример как), определять нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
__ilya__
  опции профиля:
сообщение 6.9.2012, 20:02
Сообщение #9


Студент
*

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

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




Репутация:   0  


спасибо с этим разобрался.
Еще один, не дающий, мне покоя, вопрос:
Оказывается слот можно вызывать так-же как и обычную функцию-член. Целесообразно-ли так поступать? Или это криво и написать функцию-член отдельно? -даже если функция и слот выполняют одно и то-же
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.9.2012, 11:30
Сообщение #10


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

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

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




Репутация:   94  


Цитата(__ilya__ @ 6.9.2012, 23:02) *
Оказывается слот можно вызывать так-же как и обычную функцию-член.
Собственно и слот и сигнал - функции-члены класса, с точки зрения Си++ компилятора.
Их уникальные названия (слот, сигнал) существуют по нескольким причинам:
1) Сигнал:
ты только объявляешь его, а тело функции создаёт moc - мета-объектный компилятор, в отдельном файл. И такую функцию ты можешь соединить со слотом.
2) Слот:
его можно вызывать по (текстовому) имени, например, с помощью метода QMetaObject::invokeMethod, т.к. он доступен в мета-объектной системе по имени, то его можно вызывать через сигнал (т.е. соединить с сигналом).

Цитата(__ilya__ @ 6.9.2012, 23:02) *
написать функцию-член отдельно? -даже если функция и слот выполняют одно и то-же
если они делают одно и то же, то это должна быть одна функция, если такую функцию удобно использовать как слот, то нужно её пометить как слот. А дальше используй, как удобнее в данный конкретный момент.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 29.11.2024, 5:37