Russian Qt Forum

Qt => Вопросы новичков => Тема начата: qtnewbie от Январь 11, 2017, 17:36



Название: простая задача
Отправлено: qtnewbie от Январь 11, 2017, 17:36
Здравствуйте. Программа простая - кнопка и прогрессбар на форме, при нажатии на кнопку на единицу увеличивается значение, которое отображает прогрессбар. Для этого я создаю собственный слот increase, который увеличивает на единицу переменную count, и подключаю его к сигналу нажатия кнопки. В слоте increase вызываю сигнал set_pos, который связываю с слотом setValue прогрессбара. Все это не работает, не могу понять почему.

win.h
Код:
#ifndef WIN_H
#define WIN_H
#include <QWidget>
#include <QtWidgets>

class win : public QWidget
{
public:
    win(QString str);

    QProgressBar *pgb1;
    QPushButton *btn_plus;
    QVBoxLayout *lay_main;

    int count;

signals:
    void set_pos(int);
public slots:
    void increase(bool);
};

#endif // WIN_H

win.cpp
Код:
#include "win.h"

win::win(QString str)
{
    setWindowTitle(str);

    pgb1 = new QProgressBar;
    pgb1->setOrientation(Qt::Vertical);
    btn_plus = new QPushButton("+");
    lay_main = new QVBoxLayout;

    lay_main->addWidget(pgb1);
    lay_main->addWidget(btn_plus);

    setLayout(lay_main);

    QObject::connect(btn_plus, SIGNAL(clicked()), this, SLOT(increase()));
    QObject::connect(this, SIGNAL(set_pos(int)), pgb1, SLOT(setValue(int)));
}

void win::increase(bool)
{
    count++;
    emit set_pos(count);
}

void win::set_pos(int)
{

}

main.cpp
Код:
#include <QApplication>
#include <QtWidgets>
#include "win.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    win win1("This is a window");
    win1.show();

    return app.exec();
}


Название: Re: простая задача
Отправлено: Пантер от Январь 11, 2017, 17:47
increase принимает параметр, а у clicked его нет. Убери у слота параметр.


Название: Re: простая задача
Отправлено: qtnewbie от Январь 11, 2017, 18:13
increase принимает параметр, а у clicked его нет. Убери у слота параметр.


Не помогло.
Вопрос остается в силе. Как слот с сигналом соединить в любой книге написано. А что делать если мне самому надо установить значение в прогрессбаре или просто самому передать какое-либо значение в слот? Нигде этого не видел, хотя задача простейшая, у всех должна возникать в самом начале.


Название: Re: простая задача
Отправлено: Пантер от Январь 11, 2017, 18:29
Реализацию set_pos убери. А еще в дебаге собери и посмотри, какие ошибки тебе в консоль пишутся.


Название: Re: простая задача
Отправлено: PimenS от Январь 11, 2017, 18:31
У вас как минимум 3 ошибки:

1. Класс работающий с сигналами должен иметь макрос Q_OBJECT
2. Инициализируйте count.
3. Кто за вас будет очищать память?

ЗЫ: как то так

Код:
class win : public QWidget
{
    Q_OBJECT
public:
    win(QString str);

    QProgressBar *pgb1;
    QPushButton *btn_plus;
    QVBoxLayout *lay_main;

    int count;

public slots:
    void increase();

signals:
    void set_pos(int data);
};

Цитировать
win::win(QString str) :
    QWidget()
{
    setWindowTitle(str);

    count = 0;

    pgb1 = new QProgressBar(this);
    pgb1->setOrientation(Qt::Vertical);

    btn_plus = new QPushButton("+", this);
    lay_main = new QVBoxLayout;

    lay_main->addWidget(pgb1);
    lay_main->addWidget(btn_plus);

    setLayout(lay_main);

    connect(btn_plus, SIGNAL(clicked()), this, SLOT(increase()));
    connect(this, SIGNAL(set_pos(int)), pgb1, SLOT(setValue(int)));
}
void win::increase()
{
    count++;
    emit set_pos(count);
}


Название: Re: простая задача
Отправлено: qtnewbie от Январь 11, 2017, 18:52
Спасибо, помогло. Про очистку памяти не понял. Когда удаляется экземпляр класса разве не удаляется все его элементы?


Название: Re: простая задача
Отправлено: PimenS от Январь 11, 2017, 19:11
Спасибо, помогло. Про очистку памяти не понял. Когда удаляется экземпляр класса разве не удаляется все его элементы?

Удаляются. Понятно что в вашем случае, родитель присваивается через QVBoxLayout.
Только все-таки лучше родителя указывать явно, например: pgb1 = new QProgressBar(this);
Тогда не возникает вопросов, удалится этот объект или нет.


Название: Re: простая задача
Отправлено: lit-uriy от Январь 12, 2017, 06:12
>вызываю сигнал set_pos
сигналы посылают, а не вызывают.