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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Функция  (Прочитано 5558 раз)
Hans
Гость
« : Апрель 01, 2010, 18:15 »

Добрый день.

У меня вопрос. Наверное очень простой, но все же.

Вот код.
Код:
#include <QtGui/QApplication>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QTextCodec>

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

     QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

     QWidget *window = new QWidget();
     window->setWindowTitle("Пробное приложение :)");
     window->resize(320, 240);
     window->show();

     QPushButton *button = new QPushButton("Кнопка", window);
     button->move(10, 10);
     button->show();

     QLineEdit *ledit = new QLineEdit("Новая надпись", window);
     ledit->move(10, 50);
     ledit->show();

     QLabel *mylabel = new QLabel("Надпись", window);
     mylabel->move(10, 90);
     mylabel->show();

    return a.exec();
}

Как сделать, чтобы при нажатии на кнопку текст лейбла становился, как в лайнэдите?

Сколько информации про qt не читал, везде про connect, слоты и сигналы. Я про это понял, но ведь здесь же не сделаешь так...

Прошу не посылать меня по ссылкам, а просто помочь. Улыбающийся
Записан
BRE
Гость
« Ответ #1 : Апрель 01, 2010, 18:25 »

Код
C++ (Qt)
#include <QtGui/QApplication>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QTextCodec>
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
 
    QWidget *window = new QWidget();
    window->setWindowTitle("Пробное приложение :)");
    window->resize(320, 240);
    window->show();
 
    QPushButton *button = new QPushButton("Кнопка", window);
    button->move(10, 10);
    button->show();
 
    QLineEdit *ledit = new QLineEdit("Новая надпись", window);
    ledit->move(10, 50);
    ledit->show();
 
    QLabel *mylabel = new QLabel("Надпись", window);
    mylabel->move(10, 90);
    mylabel->show();
 
    QObject::connect( ledit, SIGNAL( textChanged( const QString & ) ), mylabel, SLOT( setText( const QString & ) ) );
 
   return a.exec();
}
 

Вместо ручного позиционирования виджетов лучше воспользоваться Layout'ами.
Записан
Hans
Гость
« Ответ #2 : Апрель 01, 2010, 18:37 »

Нееет. Мне же нужно, чтобы текст изменялся при нажатии на кнопку! А в вашем примере он изменяется сразу при вводе текста.

Я с сигналами и слотами понял - это отличная штука для связи двух объектов. А я хочу понять, как при нажатии на кнопку (1 объект) текст в лейбле (2 объект) становился таким же, как и в лайнэдите (3 объект).

 Улыбающийся
Записан
SimpleSunny
Гость
« Ответ #3 : Апрель 01, 2010, 18:46 »

Лучше определить свой класс "форма" и внутри него соединять сигнал clicked со слотом изменить текст.
Записан
BRE
Гость
« Ответ #4 : Апрель 01, 2010, 19:01 »

Нееет. Мне же нужно, чтобы текст изменялся при нажатии на кнопку! А в вашем примере он изменяется сразу при вводе текста.

Я с сигналами и слотами понял - это отличная штука для связи двух объектов. А я хочу понять, как при нажатии на кнопку (1 объект) текст в лейбле (2 объект) становился таким же, как и в лайнэдите (3 объект).

 Улыбающийся
Ааа, ну тогда без помощи дополнительного класса этого не сделать.
Лучше все это оформит в отдельный класс-виджет, как советует SimpleSunny.
Записан
Hans
Гость
« Ответ #5 : Апрель 01, 2010, 19:39 »

А как это сделать в данном случае?

Все три объекта должны находится внутри моего класса-виджета?

Сейчас попробовал сделать - не получается. Я очень много примеров посмотрел - но там как-то много лишнего...

Буду очень благодарен, если вы напишите код.
 Улыбающийся

Я чувствую, что тогда я сразу пойму, что к чему.
Записан
Hans
Гость
« Ответ #6 : Апрель 01, 2010, 20:24 »

Вот что я пробую сделать, отталкиваясь от различных примеров

widget.h
Код:
#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>

namespace Ui
{
    class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

    signals:
    void nazvat();

    private slots:
    void nazhali();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H
widget.cpp
Код:
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);
}

void Widget::nazhali()
{
    emit nazvat();
}

Widget::~Widget()
{
    delete ui;
}

Но все это не работает. И я не знаю, как это прикрутить к нажатию на кнопку.
Записан
BRE
Гость
« Ответ #7 : Апрель 01, 2010, 20:35 »

Набирал прямо здесь, могут быть опечатки.

widget.h
Код
C++ (Qt)
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
 
class QPushButton;
class QLineEdit;
class QLabel;
 
class Widget : public QWidget
{
   Q_OBJECT
 
public:
   Widget(QWidget *parent = 0);
 
private slots:
void nazhali();
 
private:
QPushButton *button;
QLineEdit *ledit;
QLabel *mylabel
};
 
#endif // WIDGET_H

widget.cpp
Код
C++ (Qt)
#include "widget.h"
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QLayout>
 
Widget::Widget( QWidget *parent )
   : QWidget( parent )
{
QVBoxLayout *layout = new QVBoxLayout( this );
 
button = new QPushButton("Кнопка", window);
layout->addWidget( button );
connect( button, SIGNAL( clicked() ), SLOT( nazhali() ) );
 
ledit = new QLineEdit("Новая надпись", window);
layout->addWidget( ledit );
 
mylabel = new QLabel("Надпись", window);
layout->addWidget( mylabel );
}
 
void Widget::nazhali()
{
mylabel->setText( ledit->text() );
}
 
Записан
SimpleSunny
Гость
« Ответ #8 : Апрель 01, 2010, 20:38 »

Почти правильно =). Стоит почитать хотя бы Бланшет, тогда всё станет для Вас яснее.

А по теме, свои собственные сигналы не нужны, нужно ловить сигнал от кнопки, и в слоте менять надпись.

Код
C++ (Qt)
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QtGui/QWidget>
 
namespace Ui
{
   class Widget;
}
 
class Widget : public QWidget
{
   Q_OBJECT
 
public:
   Widget(QWidget *parent = 0);
   ~Widget();
 
private slots:
   void nazhali();
 
private:
   Ui::Widget *ui;
};
 
#endif // WIDGET_H

Код
C++ (Qt)
#include "widget.h"
#include "ui_widget.h"
 
Widget::Widget(QWidget *parent)
   : QWidget(parent), ui(new Ui::Widget)
{
   ui->setupUi(this);
 
   connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(nashali()));
}
 
void Widget::nazhali()
{
   ui->label->setText(ui->lineEdit->text());
}
 
Widget::~Widget()
{
   delete ui;
}
Записан
Hans
Гость
« Ответ #9 : Апрель 01, 2010, 21:05 »

Спасибо, конечно, только ничего не работает.  Улыбающийся

В примере BRE очень много ошибок показывает.
Две ошибки из-за пропуска одной точки с запятой, а остальные такого типа
/usr/include/qt4/QtGui/qpushbutton.h:99: note:                 QPushButton::QPushButton(QPushButtonPrivate&, QWidget*)
и такого
/home/hans/Qtfunc/widget.cpp:16: error: no matching function for call to ‘QLineEdit::QLineEdit(const char [26], <unresolved overloaded function type>)’

В примере SimpleSunny всего три:
/home/hans/Qtfunc/widget.cpp:9: error: ‘class Ui::Widget’ has no member named ‘pushButton’
/home/hans/Qtfunc/widget.cpp:14: error: ‘class Ui::Widget’ has no member named ‘label’
/home/hans/Qtfunc/widget.cpp:14: error: ‘class Ui::Widget’ has no member named ‘lineEdit’

Цитировать
Стоит почитать хотя бы Бланшет, тогда всё станет для Вас яснее.

Я пытаюсь по Шлее  Улыбающийся
« Последнее редактирование: Апрель 01, 2010, 21:11 от Hans » Записан
BRE
Гость
« Ответ #10 : Апрель 01, 2010, 21:14 »

В примере BRE очень много ошибок показывает.
Я предупреждал про опечатки.  Подмигивающий

Сделай:
qmake
make
Записан
Hans
Гость
« Ответ #11 : Апрель 01, 2010, 21:20 »

Спасибо, работает.  Улыбающийся Буду разбирать этот код...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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