Название: Сигналы/слоты
Отправлено: Sandr от Март 06, 2012, 17:30
Начинаю разбираться с сигналами и слотами. Написал небольшую программку, задача которой при клике на кнопку изменять надпись на этой кнопке. Но возникли проблемы.. #include <QApplication> #include <QLabel> #include <QPushButton> #include <QWidget> #include <QVBoxLayout> void olo(QPushButton *but) { but->setText("New Text"); } int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget *win = new QWidget; win->setWindowTitle("Text"); QHBoxLayout *lo = new QHBoxLayout; QPushButton *but = new QPushButton("Exit"); QObject::connect(but, SIGNAL(click()), but, SLOT(olo(but))); lo->addWidget(but); win->setLayout(lo); win->show(); return a.exec(); }
Прошу подсказать в чём ошибка?
Название: Re: Сигналы/слоты
Отправлено: mutineer от Март 06, 2012, 17:34
QObject::connect(but, SIGNAL(click()), but, SLOT(olo(but)));
вот тут ошибка 1) у слота не может быть больше параметров, чем у сигнала 2) but ни разу не имя типа
Название: Re: Сигналы/слоты
Отправлено: Alex Custov от Март 06, 2012, 17:44
ты читал http://qt-project.org/doc/qt-4.8/signalsandslots.html ? Слот - это метод внутри класса, а не отдельная функция. В доке всё описано.
Название: Re: Сигналы/слоты
Отправлено: Sandr от Март 06, 2012, 17:50
mutineer, исправил, теперь так QObject::connect(but, SIGNAL(click(QPushButton)), but, SLOT(olo(QPushButton)));
Но ничего не изменилось. Чот я туплю..
Alex Custov, нет, не читал. Я читаю книгу: "Qt4 GUI на C++. Жасмин Бланшет и Марк Саммелфилд". В первом примере с слотами/сигналами практически нет объяснения этого..
Название: Re: Сигналы/слоты
Отправлено: mutineer от Март 06, 2012, 17:53
Alex Custov, нет, не читал. Я читаю книгу: "Qt4 GUI на C++. Жасмин Бланшет и Марк Саммелфилд". В первом примере с слотами/сигналами практически нет объяснения этого..
Значит почитай, там все есть
Название: Re: Сигналы/слоты
Отправлено: Sandr от Март 06, 2012, 21:58
kyv, спасибо за пример. Так гораздо понятнее))
Название: Re: Сигналы/слоты
Отправлено: m_ax от Март 08, 2012, 19:46
qpushbutton2.hpp #include <QPushButton>
class QPushButton2: public QPushButton { Q_OBJECT public : QPushButton2(const QString& Text) : QPushButton(Text) {} public slots : void olo(); };
qpushbutton2.cpp #include "qpushbutton2.hpp"
void QPushButton2::olo() { setText("New Text"); }
main.cpp #include <QApplication> #include <QLabel> #include <QWidget> #include <QVBoxLayout>
#include "qpushbutton2.hpp"
int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget *win = new QWidget; win->setWindowTitle("Text"); QHBoxLayout *lo = new QHBoxLayout; QPushButton2 *but = new QPushButton2("Exit"); QObject::connect(but, SIGNAL(clicked()), but, SLOT(olo())); lo->addWidget(but); win->setLayout(lo); win->show(); return a.exec(); }
Далее: qmake -project qmake nmake или make или mingw32-make
Это несколько не разумно, наследоваться от QPushButton ради такого функционала. Зачем порождать новые классы, если можно обойтись простым объявлением слота в QWidget? widget.h C++ (Qt) #ifndef WIDGET_H #define WIDGET_H #include <QtGui/QWidget> class QPushButton; class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); void setLabels(const QString &text1, const QString &text2); private slots: void changeText(); private: QString _text1; QString _text2; static bool flag; QPushButton *_btn; }; #endif // WIDGET_H widget.cpp C++ (Qt) #include "widget.h" #include <QPushButton> #include <QVBoxLayout> bool Widget::flag = false; Widget::Widget(QWidget *parent) : QWidget(parent) { _btn = new QPushButton; QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->addWidget(_btn); connect(_btn, SIGNAL(clicked()), this, SLOT(changeText())); } void Widget::setLabels(const QString &text1, const QString &text2) { _text1 = text1; _text2 = text2; _btn->setText(_text1); } void Widget::changeText() { _btn->setText(flag ? _text1 : _text2); flag = !flag; } Widget::~Widget() { }
main.cpp C++ (Qt) #include <QtGui> #include "widget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.setLabels("text1", "text2"); w.show(); return a.exec(); }
|