Максим И.
272 повідомлення
#16 років тому
Вопрос к Qt-программистам - как правильно реализовать слот с пользовательской функцией?
Привожу код программы, которая отрисовывает небольшую форму. Нужно, чтобы при нажатии на кнопку automode в один из QLineEdit (например первый, x1edit), добавлялось какое-нибудь значение. Подскажите плиз, как это реализовать.
#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();
};

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()), this, SLOT(setValue()));
}

int main(int argc, char *argv)
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
}
Владимир А.
246 повідомлень
#16 років тому
А чем тебя не устраивает текущая схема? Все в порядке.
Максим И.
272 повідомлення
#16 років тому
Она не работает
Очистка полей работает, ибо это стандартный слот. А заполнение - нестандартный, я не знаю как его правильно прописать.
Владимир А.
246 повідомлень
#16 років тому
//x1edit->setText("123";

Комментарии точно убрал из этой строчки?


если да, то попробуй сменить другое имя слота.
Владимир А.
246 повідомлень
#16 років тому
void MyWidget::setValue()
{


x1edit->setText("123");
};


1. должно быть так, без "//"
2. этот слот "не знает" переменной x1edit, т.к. она определена в другой функции. Должен ругаться интерпретатор. Если не ругается, странно, но указатель все равно будет не тем, что нужен. Определи ее в теле класса.
Максим И.
272 повідомлення
#16 років тому
Закомментировал специально, иначе не собирается ничего.. В теле класса определял, но походу неправильно как-то, ибо все равно эффекта не было...
Владимир А.
246 повідомлень
#16 років тому
Естесственно не собирается, т.к. переменная то не определена.

Попробуй так:

#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:
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="));

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()), this, SLOT(setValue()));
}

int main(int argc, char *argv)
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
}
Максим И.
272 повідомлення
#16 років тому
Спасибо!
Теперь собирается нормально, но кнопка по-прежнему не реагирует на нажатия... То есть текст при этом не вставляется в поле..
Владимир А.
246 повідомлень
#16 років тому
Разбей класс на два файла - .h и .cpp.

Главное, не забудь добавить
Q_OBJECT
в определение класса. Без этого никаких слотов у тебя попросту нет у этого класса, вот и все.