crossplatform.ru

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

 
Тема закрытаНачать новую тему
> Использование Сигналов без Слотов, т.е. Как соеденить сигнал с любой функцией
Litkevich Yuriy
  опции профиля:
сообщение 7.2.2008, 8:59
Сообщение #1


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

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

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




Репутация:   94  


Делаю маленькую програмульку, из одного файла ради ликбеза, неохота делать отдельный класс, как поюзать сигнал, что нажата кнопка btnPath, например чтобы вызвать функцию myfunk.

Например такой код:
void myfunk (void)
{
...
}
//-----------------
int main(int argc, char *argv[])
{
  QPushButton    *btnPath = new QPushButton("Open");
  QVBoxLayout    *layout = new QVBoxLayout;

....

    layout->addWidget(btnPath);

    wgt.setLayout(layout);
    wgt.show();
}


Сообщение отредактировал Litkevich Yuriy - 31.1.2009, 13:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 7.2.2008, 10:02
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3293
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Думаю, что это нельзя сделать, так как вроде должен быть объект отправитель и объект приемщик.
Которые к тому же связаны все с разруливанием в многопоточных приложениях.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 7.2.2008, 10:25
Сообщение #3


Мастер
******

Группа: Модератор
Сообщений: 3293
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Но можно это обойти, сделав некий 'переходник', примерно так:
class CTmp: QObject 
{
    Q_OBJECT
public:
    CTmp(QWidget *parent = 0);

public slots:
    void tmpSlot();
};


void myfunk (void)
{
    QMessageBox::warning( 0, "123", "123");
}

CTmp::CTmp( QWidget *parent):QObject( parent)
{
}

void CTmp::tmpSlot()
{
    myfunk();
}

int main(int argc, char *argv[])
{
  QPushButton    *btnPath = new QPushButton("Open");
  QVBoxLayout    *layout = new QVBoxLayout;

....

    CTmp tmp;
    QObject::connect( btnPath, SIGNAL(clicked()), (const QObject *)&tmp, SLOT( tmpSlot()));

    layout->addWidget(btnPath);

    wgt.setLayout(layout);
    wgt.show();
}


Сообщение отредактировал ViGOur - 7.2.2008, 10:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.2.2008, 10:47
Сообщение #4


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

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

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




Репутация:   94  


Цитата(ViGOur @ 7.2.2008, 13:02) *
должен быть объект отправитель и объект приемщик

Да я именно с этим моментом и соображал сидел, вроде как слоты поддерживаются только классами наследоваными от QObject, и функцию получается просто так не вызвать.
Возьму твой вариант, побалыватся хватит, а потом уже свой класс сделаю.

Спасибо за шаблончик.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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