Russian Qt Forum
Ноябрь 24, 2024, 11:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: простая задача  (Прочитано 4048 раз)
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();
}
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Январь 11, 2017, 17:47 »

increase принимает параметр, а у clicked его нет. Убери у слота параметр.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
qtnewbie
Гость
« Ответ #2 : Январь 11, 2017, 18:13 »

increase принимает параметр, а у clicked его нет. Убери у слота параметр.


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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Январь 11, 2017, 18:29 »

Реализацию set_pos убери. А еще в дебаге собери и посмотри, какие ошибки тебе в консоль пишутся.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #4 : Январь 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);
}
« Последнее редактирование: Январь 11, 2017, 18:34 от PimenS » Записан
qtnewbie
Гость
« Ответ #5 : Январь 11, 2017, 18:52 »

Спасибо, помогло. Про очистку памяти не понял. Когда удаляется экземпляр класса разве не удаляется все его элементы?
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #6 : Январь 11, 2017, 19:11 »

Спасибо, помогло. Про очистку памяти не понял. Когда удаляется экземпляр класса разве не удаляется все его элементы?

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Январь 12, 2017, 06:12 »

>вызываю сигнал set_pos
сигналы посылают, а не вызывают.
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.