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 должен быть свой сигнал (в смысле пользовательский), но как его сотварить???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 7.9.2012, 11:30
Сообщение #2


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

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

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




Репутация:   94  


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

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

Сообщений в этой теме


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


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




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