Russian Qt Forum

Qt => Вопросы новичков => Тема начата: bars268 от Декабрь 13, 2012, 19:28



Название: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 19:28
Код:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget wgt;
    QTextEdit*      edit = new QTextEdit();
    QTextEdit*   text = new QTextEdit();
    QPushButton*    but  = new QPushButton("Go");

    QBoxLayout* lo = new QBoxLayout(QBoxLayout::TopToBottom);
    lo->addWidget(edit,1);
    lo->addWidget(text,1);
    lo->addWidget(but, 1);
    wgt.setLayout(lo);



    text->setReadOnly(true);

    wgt.resize(600,200);
    wgt.show();
    lbl.show();
    QObject::connect(&but,SIGNAL(clicked()), &text,SLOT(AddColor(edit->toPlainText())));

    return a.exec();
}

Ошибка где то в присоединении QObject::connect
Но я не могу понять что именно там не так
функция AddColor(Qstring)

Текст ошибки
\main.cpp:44: ошибка: no matching function for call to 'QObject::connect(QPushButton**, const char*, QTextEdit**, const char*)'


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 19:32
Амперсанды лишние. в connect надо передвать указатели, а не указатели на указатели

Код:
SLOT(AddColor(edit->toPlainText()))
Это вот тоже неправильно


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: GreatSnake от Декабрь 13, 2012, 19:33
Текст ошибки
\main.cpp:44: ошибка: no matching function for call to 'QObject::connect(QPushButton**, const char*, QTextEdit**, const char*)'
Тебе компилятор явно сказал, что он не хочет принимать "указатель на указатель".
От каких великих знаний перед but и text появилось & ?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 19:35
Амперсанды лишние. в connect надо передвать указатели, а не указатели на указатели

Код:
SLOT(AddColor(edit->toPlainText()))
Это вот тоже неправильно
Спасибо огромное! Я не уследил по неопытности(
А как правильно вызывать функцию AddColor(edit->toPlainText())?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 19:37
1) У QTextEdit нет метода AddColor
2) Что в макросе SLOT делает edit->toPlainText() ? Что оно должно символизировать и где ты увидел возможность так писать? Доку по сигналам/слотам читал?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 19:39
1) У QTextEdit нет метода AddColor
Функцию AddColor я написал сам.
2) Что в макросе SLOT делает edit->toPlainText() ? Что оно должно символизировать и где ты увидел возможность так писать? Доку по сигналам/слотам читал?
Читал, но, видимо, не понял до конца, вот и прошу тут помощи


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 19:41
ты не мог ее написать классу QTextEdit, потому что это Qt-класс (ну разве что ты дописал ее в исходники Qt и пересобрал, но это имеет мало смысла)

В макросы SIGNAL() и SLOT() пишется имя метода и типы его параметров, а не значения


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: Bepec от Декабрь 13, 2012, 19:42
Шлее, страница помоему 80, глава "Сигналы и слоты". Почитай, хуже не станет.


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: GreatSnake от Декабрь 13, 2012, 19:43
Читал, но, видимо, не понял до конца, вот и прошу тут помощи
Это (http://doc.crossplatform.ru/qt/4.7.x/signalsandslots.html) читал?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 19:44
Ничего я не дописывал, я просто написал функцию, которая возвращает QString
А потом методом Settext пытался засунуть то что получилось из функции в QTextEdit


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 19:44
Шлее, страница помоему 80, глава "Сигналы и слоты". Почитай, хуже не станет.
у меня щас рядом лежит его книга, по Qt 4.8 но что то до меня никак не доходит(


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 19:45
Ничего я не дописывал, я просто написал функцию, которая возвращает QString
А потом методом Settext пытался засунуть то что получилось из функции в QTextEdit

Код полностью покажи, а особенно то место, в котором эта функция должна была стать слотом объекта text


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 19:46
Код:
#include <QtGui/QApplication>
#include <QWidget>
#include <QPushButton>
#include <QTextBrowser>
#include <QBoxLayout>
#include <QTextEdit>
#include <QString>
#include <QLabel>

QString AddColor(QString text);
QString ColorChoose();

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget wgt;
    QTextEdit*      edit = new QTextEdit("");
    QTextEdit*  text = new QTextEdit();
    QPushButton*    but  = new QPushButton("Go");


    QBoxLayout* lo = new QBoxLayout(QBoxLayout::TopToBottom);
    lo->addWidget(edit,1);
    lo->addWidget(text,1);
    lo->addWidget(but, 1);
    wgt.setLayout(lo);



    text->setReadOnly(true);

    wgt.resize(600,200);
    wgt.show();
    //QObject::connect(but,SIGNAL(clicked()), text,SLOT())));

    return a.exec();
}

QString AddColor(QString text)
{
    QString Text2;
    QString temp;
    for (int i=0;i<text.length();i++)
    {
        temp=text[i];
        Text2.append("[color=");
        Text2.append(ColorChoose());
        Text2.append("]");
        Text2.append(temp);
        Text2.append("[/color]");
    }
    return Text2;
}

QString ColorChoose()
{
    QString color;
    int range=15;
    int min=1;
    int colorID=rand() % (range+1) + min;
    switch (colorID)
    {
    case 1:
        color="Blue";
        break;
    case 2:
        color="Red";
        break;
    case 3:
        color="Yellow";
        break;
    case 4:
        color="Purple";
        break;
    case 5:
        color="Green";
        break;
    case 6:
        color="Olive";
        break;
    case 7:
        color="Crimson";
        break;
    case 8:
        color="Magenta";
        break;
    case 9:
        color="OrangeRed";
        break;
    case 10:
        color="DeepPink";
        break;
    case 11:
        color="DarkOrange";
        break;
    case 12:
        color="Tomato";
        break;
    case 13:
        color="Lime";
        break;
    case 14:
        color="Aqua";
        break;
    default:
        color="Black";
        break;
    }
    return color;
}


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 19:47
AddColor никоим образом не является слотом объекта text, и вообще ничьим слотом не является. Коннектиться к ней бесполезно. С++ учил?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 19:48
То есть для слота и сигнала мне нужно создавать свой класс, унаследованный от QObject?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 19:50
То есть для слота и сигнала мне нужно создавать свой класс, унаследованный от QObject?

В доке по сигналам и слотам, а так же в любой книге по Qt написано, что сигналы и слоты могут быть только у наследника QObject. Читай внимательнее


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 19:52
То есть для слота и сигнала мне нужно создавать свой класс, унаследованный от QObject?

В доке по сигналам и слотам, а так же в любой книге по Qt написано, что сигналы и слоты могут быть только у наследника QObject. Читай внимательнее
А не могли бы вы, для примера, исправить программу так, чтобы текст из edit пропускался через функцию AddColor и выводился в text по нажатию кнопки but?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 19:54
Нет, примеров полно, как в книге, так и в документации. Учись, а то будешь потом за каждым элементарным чихом на форум лазить


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 19:55
Нет, примеров полно, как в книге, так и в документации. Учись, а то будешь потом за каждым элементарным чихом на форум лазить
Сейчас буду пробовать, если что придется опять сюда идти, спасибо за помощь!


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: Bepec от Декабрь 13, 2012, 20:25
*свистит*
Платные консультации всем приятны. ::)
*скрывается в лесу*


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 21:54
Все равно не выходит, не могу я понять что там куда в этих классах прописывать...


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 22:03
С С++ и ООП вообще знаком?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 22:15
С С++ и ООП вообще знаком?
конечно знаком. Другое дело если я что то не понимаю. Хотя вроде все нормально


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 22:17
И что у тебя не получается?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 22:20
В общем говоря, я не знаю как заставить функцию работать по нажатию буттона, а примеров нигде не нахожу


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 22:22
Примеров реакции на нажатие кнопки не находишь? В чем затруднение у тебя?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 22:26
я не знаю с какой именно стороны подойти к решению, и за что браться, чточитать


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 22:27
С книги по Qt и документации по сигналам/слотам


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: kambala от Декабрь 13, 2012, 22:29
пример есть в описании класса QPushButton.

добавлено: а нет, нету. есть лишь описание сигналов в QAbstractButton, ну а как соедиять сигналы и слоты — написано в соответствующем разделе документации.


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 22:34
В документации нет примера с конкретной функцией, которая лежит в мейне


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 22:38
Вот тебе простейший пример с реакцией на нажатие кнопки
http://code-live.ru/post/getting-started-qt/


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 23:10
Все, я сдаюсь. Так и не получилось


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 23:12
По ссылке пример проще некуда. Что могло не получиться?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 23:15
Там не то что у меня...\И даже не похоже


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 23:17
Там  есть кнопка, по нажатию этой кнопки выполняются некие действия. Это практически то же самое, что и у тебя


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 23:21
какое то действие... все равно не понимаю. тупик(


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 23:23
мда... ну не понимай дальше, раз не можешь нормально описать проблему


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 23:32
Проблема в том что я не понимаю что и как писать в "*.h"


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 13, 2012, 23:41
Видимо проблема в том, что ты не умеешь работать с классами в С++. Я прав?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 13, 2012, 23:53
видимо да


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: mutineer от Декабрь 14, 2012, 00:02
Ну значит начинать тебе надо не с Qt, а с ООП и С++


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: GreatSnake от Декабрь 14, 2012, 07:37
Ну значит начинать тебе надо не с Qt, а с ООП и С++
Я бы не был столь категоричным.
Всё-таки с сигналами/слотами есть некоторые нюансы с ООП и С++ несвязанные.
Например, описание класса с Q_OBJECT по дефолту должно быть в *.h.
Что совсем не очевидно и меня очень часто неимоверно раздражает.


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: Bepec от Декабрь 14, 2012, 08:10
Я бы сказал проще - человеку нехватает знания разделов и технологии построения ООП в С++ :)

Я б посоветовал поделать примеры по книге любой.


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: carrygun от Декабрь 14, 2012, 09:01
Сейчас открыл справку по сигналам/слотам, там все расписано довольно адекватно с примерами (в том числе и
Цитировать
что и как писать в "*.h"
) и даже с картинками.
Что конкретно вызывает затруднение? Мне кажется, что система даже интуитивно понятна.


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 14, 2012, 10:37
Вроде написал, но не пойму что теперь не так
counter.h
Код:
#ifndef WIDGET_H
#define WIDGET_H

#include <QObject>
#include <QTextEdit>
#include <QString>


class Counter : public QObject
{
    Q_OBJECT
public:
    QTextEdit          edit;
    QTextEdit          fintext;
    Counter();
    QString AddColor(QString text);
    QString ColorChoose();

public slots:
    void SetString();
private:
    QString tekst;
};
#endif
main.cpp
Код:
#include <QtGui/QApplication>
#include <QWidget>
#include <QPushButton>
#include <QTextBrowser>
#include <QBoxLayout>
#include <QTextEdit>
#include <QString>
#include <QLabel>
#include "counter.h"
//////////////////////////////////////////
Counter::Counter() : QObject()
{
}
void Counter::SetString()
{
    tekst=edit.toPlainText();
    fintext.setText(AddColor(tekst));
}
//////////////////////////////////////////

int main(int argc, char *argv[])
{
    QApplication        a(argc, argv);
    QWidget             wgt;
    QPushButton*        but  = new QPushButton("Go");
    Counter             counter;


    QBoxLayout* lo = new QBoxLayout(QBoxLayout::TopToBottom);
    lo->addWidget(&counter.edit, 1);
    lo->addWidget(&counter.fintext, 1);
    lo->addWidget(but, 1);
    wgt.setLayout(lo);

    counter.fintext.setReadOnly(true);

    wgt.resize(600,200);
    wgt.show();
    QObject::connect(but,SIGNAL(clicked()), &counter.fintext,SLOT(SetString()));

    return a.exec();
}

QString Counter::AddColor(QString text)
{
    QString Text2;
    QString temp;
    for (int i=0;i<text.length();i++)
    {
        temp=text[i];
        Text2.append("[color=");
        Text2.append(ColorChoose());
        Text2.append("]");
        Text2.append(temp);
        Text2.append("[/color]");
    }
    return Text2;
}

QString Counter::ColorChoose()
{
    QString color;
    int range=15;
    int min=1;
    int colorID=rand() % (range+1) + min;
    switch (colorID)
    {
    case 1:
        color="Blue";
        break;
    case 2:
        color="Red";
        break;
    case 3:
        color="Yellow";
        break;
    case 4:
        color="Purple";
        break;
    case 5:
        color="Green";
        break;
    case 6:
        color="Olive";
        break;
    case 7:
        color="Crimson";
        break;
    case 8:
        color="Magenta";
        break;
    case 9:
        color="OrangeRed";
        break;
    case 10:
        color="DeepPink";
        break;
    case 11:
        color="DarkOrange";
        break;
    case 12:
        color="Tomato";
        break;
    case 13:
        color="Lime";
        break;
    case 14:
        color="Aqua";
        break;
    default:
        color="Black";
        break;
    }
    return color;
}
Программа запускается и компилируется, слот прописал, сигнал же не нужен (?) (ведь сигналом служит clicked())
Но при нажатии ничего не происходит


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: GreatSnake от Декабрь 14, 2012, 10:54
Повторите вслух и громко что делает этот вызов
Код
C++ (Qt)
QObject::connect(but,SIGNAL(clicked()), &counter.fintext,SLOT(SetString()));
причём несколько раз.

Update: если до сих пор не дошло, объясняю:
этим вызовом мы связываем кнопку but с редактором counter.fintext, чтобы по нажатию кнопки вызвался метод редактора counter.fintext.SetString().
Далее выясняем, что у QTextEdit такого метода нет, а он есть у Counter.


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: carrygun от Декабрь 14, 2012, 10:55
Потому что у "fintext" который QTextEdit нет слота SetString() (о чем должно было сказать приложение в стандартный вывод, который ты видимо почемуто не читаешь). Оставь просто "&counter" и, пожалуйста, разбирайся внимательнее.


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 14, 2012, 10:58
Повторите вслух и громко что делает этот вызов
Код
C++ (Qt)
QObject::connect(but,SIGNAL(clicked()), &counter.fintext,SLOT(SetString()));
причём несколько раз.
Связывает кнопку but по сигналу clicked с формой?


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 14, 2012, 11:00
Потому что у "fintext" который QTextEdit нет слота SetString() (о чем должно было сказать приложение в стандартный вывод, который ты видимо почемуто не читаешь). Оставь просто "&counter" и, пожалуйста, разбирайся внимательнее.
Спасибо огромное! Да, я действительно невнимателен( но, думаю, это по неопытности и в скором времени пройдет


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: GreatSnake от Декабрь 14, 2012, 11:02
Да, я действительно невнимателен( но, думаю, это по неопытности и в скором времени пройдет
Очень хотелось бы надеяться, особенно на 4-ой странице...


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: bars268 от Декабрь 14, 2012, 11:06
Всем спасибо за помощь, я наконец разобрался с сигналами и слотами)


Название: Re: Ошибка в программе. Сигналы и слоты.
Отправлено: Bepec от Декабрь 17, 2012, 09:51
Вери гуд.