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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигналы/слоты  (Прочитано 3297 раз)
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();
}
 

Прошу подсказать в чём ошибка?
Записан
mutineer
Гость
« Ответ #1 : Март 06, 2012, 17:34 »

QObject::connect(but, SIGNAL(click()), but, SLOT(olo(but)));

вот тут ошибка
1) у слота не может быть больше параметров, чем у сигнала
2) but ни разу не имя типа
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Март 06, 2012, 17:44 »

ты читал http://qt-project.org/doc/qt-4.8/signalsandslots.html ? Слот - это метод внутри класса, а не отдельная функция. В доке всё описано.
Записан
Sandr
Гость
« Ответ #3 : Март 06, 2012, 17:50 »

mutineer, исправил, теперь так
QObject::connect(but, SIGNAL(click(QPushButton)), but, SLOT(olo(QPushButton)));

Но ничего не изменилось. Чот я туплю..


Alex Custov, нет, не читал. Я читаю книгу: "Qt4 GUI на C++. Жасмин Бланшет и Марк Саммелфилд". В первом примере с слотами/сигналами практически нет объяснения этого..
Записан
mutineer
Гость
« Ответ #4 : Март 06, 2012, 17:53 »

Alex Custov, нет, не читал. Я читаю книгу: "Qt4 GUI на C++. Жасмин Бланшет и Марк Саммелфилд". В первом примере с слотами/сигналами практически нет объяснения этого..

Значит почитай, там все есть
Записан
Sandr
Гость
« Ответ #5 : Март 06, 2012, 21:58 »

kyv, спасибо за пример. Так гораздо понятнее))
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #6 : Март 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();
}
 

« Последнее редактирование: Март 08, 2012, 19:50 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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