crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Функция автозаполнения для QLineEdit, не могу разобраться с слотами
FladeX
  опции профиля:
сообщение 20.2.2009, 2:04
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

Спасибо сказали: 0 раз(а)




Репутация:   0  


Не получается разобраться с слотом для автоматического заполнения полей.
Имеется следующий код, реализующий простенькую форму с 5 QLabel, 5 QLineEdit и 3 QPushButton:
#include <QApplication>
#include <QMainWindow>
#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QGridLayout>
#include <QVBoxLayout>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
public slots:
    void setValue();
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    QVBoxLayout *layout = new QVBoxLayout;
    QGridLayout *grid = new QGridLayout;

    QLabel *x1label = new QLabel(tr("x1="));
    QLabel *y1label = new QLabel(tr("y1="));
    QLabel *x2label = new QLabel(tr("x2="));
    QLabel *y2label = new QLabel(tr("y2="));
    QLabel *slabel = new QLabel(tr("S="));

    QLineEdit *x1edit = new QLineEdit;
    QLineEdit *y1edit = new QLineEdit;
    QLineEdit *x2edit = new QLineEdit;
    QLineEdit *y2edit = new QLineEdit;
    QLineEdit *sedit = new QLineEdit;

    QPushButton *automode = new QPushButton(tr("Auto"));
    QPushButton *resetmode = new QPushButton(tr("Reset"));
    QPushButton *gomode = new QPushButton(tr("Go!"));

    grid->addWidget(x1label, 0, 0);
    grid->addWidget(y1label, 1, 0);
    grid->addWidget(x2label, 2, 0);
    grid->addWidget(y2label, 3, 0);
    grid->addWidget(slabel, 4, 0);

    grid->addWidget(x1edit, 0, 1);
    grid->addWidget(y1edit, 1, 1);
    grid->addWidget(x2edit, 2, 1);
    grid->addWidget(y2edit, 3, 1);
    grid->addWidget(sedit, 4, 1);

    grid->addWidget(automode, 5, 1);
    grid->addWidget(resetmode, 6, 1);
    grid->addWidget(gomode, 7, 1);

    layout->addLayout(grid);
    setLayout(layout);

    connect(resetmode, SIGNAL(clicked()), x1edit, SLOT(clear()));
    connect(resetmode, SIGNAL(clicked()), y1edit, SLOT(clear()));
    connect(resetmode, SIGNAL(clicked()), x2edit, SLOT(clear()));
    connect(resetmode, SIGNAL(clicked()), y2edit, SLOT(clear()));
    connect(resetmode, SIGNAL(clicked()), sedit, SLOT(clear()));

    connect(automode, SIGNAL(clicked()), x1edit, SLOT(setValue()));
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

Мне нужно сделать автозаполнение всех 5 QLineEdit при нажатии на automode. Я добавил connect, но с описанием слота, а точнее функции setValue() возникли затруднения. Подскажите плиз, как надо сделать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.2.2009, 3:13
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(FladeX @ 20.2.2009, 5:04) *
connect(automode, SIGNAL(clicked()), x1edit, SLOT(setValue()));
я так понимаю здесь setValue() предпологается членом твоего класса MyWidget?
если так то в функции коннект нужно указывать this, вместо x1edit


П.С. пока непоздно, перенеси весь класс MyWidget в отдельную пару файлов mywidget.h и mywidget.cpp, не взирая на компактность примера.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 20.2.2009, 9:02
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


И опять нет макроса Q_OBJECT и в конце "include main.moc"

Я вообще советую не создавать динамически кнопочки. Лучше .ui файл создать и как сказал Юрий вынести класс в отдельные файлы. И тоже верно подмечено setValue - слот MyWidget'a, а не x1edit. И возьми за правило передавать parent'a дочерним объектам, а то рано или поздно нарвешься на утечку памяти. А то ведь когда наступит время перепроектировать интерфейс придется угробить не мало времени, чтобы все переделать.

Цитата
но с описанием слота, а точнее функции setValue() возникли затруднения

Какие? Просто реализуй функцию.

А вообще когда дело доходит до такого количество однотипных коннектов есть смысл поместить кнопки в QButtonGroup.

Сообщение отредактировал SABROG - 20.2.2009, 9:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FladeX
  опции профиля:
сообщение 20.2.2009, 11:36
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 20.2.2009, 3:13) *
если так то в функции коннект нужно указывать this, вместо x1edit

Поправил.
Сама функция такая будет?
void MyWidget::setValue()
{
    x1edit.setText("x1");
    y1edit.setText("y1");
    x2edit.setText("x2");
};

Но тогда с областью видимости не могу разобраться, компилятор ругается
main.cpp: In member function ‘void MyWidget::setValue()’:
main.cpp:20: error: ‘x1edit’ was not declared in this scope
make: *** [main.o] Ошибка 1


В отдельные файлы вынесу, мне главное принцип понять на примере данной функции, а дальше разберусь (надеюсь).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 20.2.2009, 11:50
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Ну правильно пишет, ведь у тебя объекты объявляются и создаются в конструкторе и только в пределах видимости (скобок {}) о них известно. Как временное решение могу посоветовать объявление указателей вынести в секцию данных класса.

private:
QVBoxLayout *layout;
...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.2.2009, 12:45
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(FladeX @ 20.2.2009, 14:36) *
x1edit.setText("x1");
Цитата(FladeX @ 20.2.2009, 14:36) *
Но тогда с областью видимости не могу разобраться, компилятор ругается
у тебя все объекты созданы:
во-первых/во-вторых, как указатели, а ты их используешь как обычные переменные;
во-вторых/во-первых, обявлены в конструкторе, а раз ты их хочешь использовать за пределами его, то надо вынести в объявление класса;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FladeX
  опции профиля:
сообщение 20.2.2009, 14:05
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ткните плиз пальцем, где и что не так:
#include <QApplication>
#include <QMainWindow>
#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QGridLayout>
#include <QVBoxLayout>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
private:
    QVBoxLayout *layout;
    QGridLayout *grid;
    QLineEdit *x1edit;
public slots:
    void setValue();
};

void MyWidget::setValue()
{
    x1edit->setText("123");
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    //QVBoxLayout *layout = new QVBoxLayout;
    //QGridLayout *grid = new QGridLayout;

    QLabel *x1label = new QLabel(tr("x1="));
    QLabel *y1label = new QLabel(tr("y1="));
    QLabel *x2label = new QLabel(tr("x2="));
    QLabel *y2label = new QLabel(tr("y2="));
    QLabel *slabel = new QLabel(tr("S="));

    //QLineEdit *x1edit = new QLineEdit;
    QLineEdit *y1edit = new QLineEdit;
    QLineEdit *x2edit = new QLineEdit;
    QLineEdit *y2edit = new QLineEdit;
    QLineEdit *sedit = new QLineEdit;

    QPushButton *automode = new QPushButton(tr("Auto"));
    QPushButton *resetmode = new QPushButton(tr("Reset"));
    QPushButton *gomode = new QPushButton(tr("Go!"));

    grid->addWidget(x1label, 0, 0);
    grid->addWidget(y1label, 1, 0);
    grid->addWidget(x2label, 2, 0);
    grid->addWidget(y2label, 3, 0);
    grid->addWidget(slabel, 4, 0);

    grid->addWidget(x1edit, 0, 1);
    grid->addWidget(y1edit, 1, 1);
    grid->addWidget(x2edit, 2, 1);
    grid->addWidget(y2edit, 3, 1);
    grid->addWidget(sedit, 4, 1);

    grid->addWidget(automode, 5, 1);
    grid->addWidget(resetmode, 6, 1);
    grid->addWidget(gomode, 7, 1);

    layout->addLayout(grid);
    setLayout(layout);

    connect(resetmode, SIGNAL(clicked()), x1edit, SLOT(clear()));
    connect(resetmode, SIGNAL(clicked()), y1edit, SLOT(clear()));
    connect(resetmode, SIGNAL(clicked()), x2edit, SLOT(clear()));
    connect(resetmode, SIGNAL(clicked()), y2edit, SLOT(clear()));
    connect(resetmode, SIGNAL(clicked()), sedit, SLOT(clear()));

    connect(automode, SIGNAL(clicked()), x1edit, SLOT(setValue()));
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

На примере x1edit можете показать "как надо"? Был бы весьма признателен.
ЗЫ. Трудно разобраться с ООП после скриптовых языков...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 20.2.2009, 14:19
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(FladeX @ 20.2.2009, 14:05) *
На примере x1edit можете показать "как надо"? Был бы весьма признателен.

connect(automode, SIGNAL(clicked()), this, SLOT(setValue()));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FladeX
  опции профиля:
сообщение 20.2.2009, 14:42
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 20.2.2009
Пользователь №: 564

Спасибо сказали: 0 раз(а)




Репутация:   0  


Не работает. Вообще не появляется окно, хотя компилится все нормально...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 20.2.2009, 15:09
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(FladeX @ 20.2.2009, 14:42) *
Не работает. Вообще не появляется окно, хотя компилится все нормально...

Читай мой пост выше про Q_OBJECT макрос и #include "main.moc"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.8.2022, 11:16