Qt. Слот с пользовательской функцией
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();
}
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 лет назад
Спасибо!Теперь собирается нормально, но кнопка по-прежнему не реагирует на нажатия... То есть текст при этом не вставляется в поле..