Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: сигналы слоты __ запутался
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
__ilya__
есть два класса 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__
чем больше читаю про сигналы-слоты, тем больше запутываюсь
что это? обмен данными в глобальном пространстве?
ilyabvt
Цитата
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
Цитата(__ilya__ @ 22.6.2012, 23:01) *
обмен данными в глобальном пространстве?


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

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


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

как сделать чтоб при нажатии на каждую высылался свой сигнал? то есть надо определить три пользовательских сигнала. как их связать, каждый со своей кнопкой?.
приведите пример с куском кода
ilyabvt
Цитата
в классе 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
__ilya__
ilyabvt, а MySignal1,2,3 както определять, объявлять не надо?
ilyabvt
Цитата
ilyabvt, а MySignal1,2,3 както определять, объявлять не надо?

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

Цитата(__ilya__ @ 6.9.2012, 23:02) *
написать функцию-член отдельно? -даже если функция и слот выполняют одно и то-же
если они делают одно и то же, то это должна быть одна функция, если такую функцию удобно использовать как слот, то нужно её пометить как слот. А дальше используй, как удобнее в данный конкретный момент.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.