Название: простая задача Отправлено: 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
сигналы посылают, а не вызывают. |