Russian Qt Forum

Qt => Общие вопросы => Тема начата: Ker от Август 04, 2009, 20:15



Название: connect сигналы и слоты=(
Отправлено: Ker от Август 04, 2009, 20:15
Новичок и само собой не понимаю...
В принципе нужно что бы при нажатии кнопки QPushButton выводилась строка в поле QTextEdit.

Код:
QPushButton *pushButton = new QPushButton("Button");
QTextEdit *textEdit = new QTextEdit();
QString str = "TEST";

connect(pushButton, SIGNAL(clicked()), textEdit, SLOT(setPlainText(str)));

Подскажите что не так...?


Название: Re: connect сигналы и слоты=(
Отправлено: spectre71 от Август 04, 2009, 20:24
Новичок и само собой не понимаю...
В принципе нужно что бы при нажатии кнопки QPushButton выводилась строка в поле QTextEdit.

Код:
QPushButton *pushButton = new QPushButton("Button");
QTextEdit *textEdit = new QTextEdit();
QString str = "TEST";

connect(pushButton, SIGNAL(clicked()), textEdit, SLOT(setPlainText(str)));

Подскажите что не так...?

Все!
Почитай для начала книжку по QT.
http://torrents.ru/forum/viewtopic.php?t=687311 (http://torrents.ru/forum/viewtopic.php?t=687311)
http://torrents.ru/forum/viewtopic.php?t=597355 (http://torrents.ru/forum/viewtopic.php?t=597355)


Название: Re: connect сигналы и слоты=(
Отправлено: Alex Custov от Август 04, 2009, 20:33
Откройте документацию.

Цитировать

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection )   [static]

...

Note that the signal and slots parameters must not contain any variable names, only the type. E.g. the following would not work and return false:

Код:
         // WRONG
         QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
                          label, SLOT(setNum(int value)));


Название: Re: connect сигналы и слоты=(
Отправлено: denka от Август 04, 2009, 21:28
То что ты хочешь сделать, делаеться с помощью QSignalMapper


Название: Re: connect сигналы и слоты=(
Отправлено: MoPDoBoPoT от Август 04, 2009, 21:49
То что ты хочешь сделать, делаеться с помощью QSignalMapper
Ты специально хочешь запутать человека? (:
Соглашусь с советом Spectre, необходимо прочитать хотя бы одну книгу по Qt.


Название: Re: connect сигналы и слоты=(
Отправлено: lit-uriy от Август 05, 2009, 05:35
Сколько бы не было написано в Асистенте, но все ошибку совершают с сигналами и слотами (и я тоже на эту граблю наступал). По этому поводу даже в вики написал: Сигналы и слоты (Qt) (http://www.wiki.crossplatform.ru/index.php/Сигналы_и_слоты_(Qt))

И ещё не помешает старое учебное пособие (http://doc.crossplatform.ru/qt/4.4.3/tutorials-tutorial.html) прочитать (то что в 4.5. убрали)


Название: Re: connect сигналы и слоты=(
Отправлено: Vexator от Август 05, 2009, 06:58
тебе хотят сказать, что передавать переменные таким путем нельзя
такое сработало бы, если бы твоя строка str передавалась бы из сигнала clicked()
Код:
connect(pushButton, SIGNAL(clicked(QString)), textEdit, SLOT(setPlainText(QString)));
но для такого тебе потребуется наследовать свой класс от QPushButton

вообщем читай про слоты подробнее


Название: Re: connect сигналы и слоты=(
Отправлено: sergeyvl12 от Август 20, 2009, 18:21
Все!
Почитай для начала книжку по QT.
http://torrents.ru/forum/viewtopic.php?t=687311 (http://torrents.ru/forum/viewtopic.php?t=687311)
http://torrents.ru/forum/viewtopic.php?t=597355 (http://torrents.ru/forum/viewtopic.php?t=597355)
Тебе не кажется что это - универсальный ответ на любой вопрос начинающего?
Я думаю автор уже кое-что читал.
Если кратко, то сигнал и слот должны совпадать по параметрам.
В твоем случае нужно очевидно сделать слот без параметров (на форме), связать его с кнопкой в connect() и из этого слота уже вызывать setPlainText(QString)



Название: Re: connect сигналы и слоты=(
Отправлено: Rcus от Август 20, 2009, 18:39
Гыгы гыгы :) Универсальный ответ грите? Когда у меня были проблемы начинающего с Qt/Embedded что-то никто мне не кинул линков на нужные книги(а как хотелось). А на данный вопрос именно ссылка на документацию является более корректным ответом, поскольку в ней дается не только прямой ответ на вопрос, но и объясняется общий принцип действия и ньюансы которые не укладываются в формат ответа на форуме.


Название: Re: connect сигналы и слоты=(
Отправлено: sergeyvl12 от Август 20, 2009, 19:17
Видел я эти книги! Все они начинаются с примеров и нужно немало прочитать вперед и перепробовать немало примеров чтобы что-то мало-мальски начать понимать (тем более что moc немного исковеркал или если хотите "дополнил" C++). А человек очевидно попытался немного переделать один из этих начальных примеров. Не получилось с ходу. Бывает. А вы его опять посылаете изучать те же книги и те же примеры.

Давайте тогда на форуме "Для начинающих" повесим жирными буквами надпись: Форум закрыт, читайте книги! И дело с концом.

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

Извините за оффтоп! Давайте закроем эту дискуссию, в конце концов я немного погорячился и как отвечать на форуме - личное дело каждого.



Название: Re: connect сигналы и слоты=(
Отправлено: Igors от Август 20, 2009, 19:41
Здравствуйте, Сергей
...
(тем более что moc немного исковеркал или если хотите "дополнил" C++).
...
Не знаю что Вы имеете ввиду. Лично для меня (новичка в Qt) все эти moc и qmake пока больше геморрой чем выгода. Да, это сэкономит мне сотню строк, но для меня это не великая проблема, руками напишу, не переломлюсь :)  Но вот торопиться с выводами  по-моему не стоит. Поюзаем, посмотрим, а дальше - жизнь покажет  :)


Название: Re: connect сигналы и слоты=(
Отправлено: Новгородец от Август 20, 2009, 19:58
Один из вариантов решения.
А что не так, выше уже написали. 
Но книги все таки надо читать.

Код
C++ (Qt)
// main.cpp
#include <QApplication>
#include "MyDialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyDialog b;
b.show();
return a.exec();
}

Код
C++ (Qt)
// MyDialog.h
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QDialog>
class QString;
class QTextEdit;
class QPushButton;
class MyDialog : public QDialog
{
Q_OBJECT
public:
MyDialog();
private:
QPushButton *pushButton;
QTextEdit *textEdit;
QString str;
private slots:
void slot();
};
#endif // MYDIALOG_H

Код
C++ (Qt)
// MyDialog.cpp
#include "MyDialog.h"
#include <QtGui>
MyDialog::MyDialog()
{
  pushButton = new QPushButton("Button");
  textEdit = new QTextEdit();
  str = "TEST";
  QHBoxLayout *Layout = new QHBoxLayout(this);
  Layout->addWidget(textEdit);
  Layout->addWidget(pushButton);
  setLayout(Layout);
  connect(pushButton, SIGNAL(clicked()), SLOT(slot()));;
}
 
void MyDialog::slot()
{
textEdit->setPlainText(str);
}



Название: Re: connect сигналы и слоты=(
Отправлено: C010ne1 от Август 10, 2019, 11:25
10 лет прошло и у новичков опять вопросы про connect...
Использую Qt Creator 4.8.2. Основан на Qt 5.12.2
Как работает connect я разобрался (вроде бы...) и у меня вопрос скорей про Creator.
Беру пример:
    QPushButton *close = new QPushButton("Выход");
    connect(close,SIGNAL(clicked()),this,SLOT(close()));

Пример рабочий, но когда я ручками пишу эти строчки Creator мне не подсказывает список возможных сигналов и слотов :(
И такая проблема во всех моих проектах. Достало уже лазить каждый раз в помощь и смотреть перечень сигналов и слотов в нужном мне каком-то классе. Или лазить копировать из описания своего какого-то класса.
В настройках Creatora ничего не нашел. В интернете у всех на ютубе, когда пишут SIGNAL или SLOT всплывает список сигналов и слотов соответственно, а у меня нет...
Руками писать - частые ошибки (разбирай потом).
Я в печали...
Help me please.


Название: Re: connect сигналы и слоты=(
Отправлено: vbv от Август 10, 2019, 12:26
Только что обратил внимание Creator 4.9.2.
То-же не подсказывает.
Никогда не обращал внимание. :)

Может потому не подсказывает, что пишу на Qt4....
Была замечена проблема подсказок у Creator'a при использовании namespace,
времени разбираться не было и не стал заморачиваться а потом забыл.

Надо попробовать чистый project сгенерить.

Добавлено:
По пробовал:
1. Проблема не в namespaces.
2. Проблема не в версии QT.
Надо будет разобраться.



Название: Re: connect сигналы и слоты=(
Отправлено: vbv от Август 10, 2019, 12:56
Отвечаю: они изменили методику вызова.

https://wiki.qt.io/New_Signal_Slot_Syntax

Старая модель:
connect(
    sender, SIGNAL( valueChanged( QString, QString ) ),
    receiver, SLOT( updateValue( QString ) )
);

Новая модель:

connect(
    sender, &Sender::valueChanged,
    receiver, &Receiver::updateValue
);

И тогда подсказывает.

Или как вариант:
запретить Help > About Plugins > Clang Code Model


Название: Re: connect сигналы и слоты=(
Отправлено: C010ne1 от Август 10, 2019, 15:31
Ура! Заработало!
Последний вариант.
Спасибо.