Я новичек в qt.
Сегодня взялся тестировать QLineEdit класс. Почти написал то, что хотел, но работает это все не так как хочу я. А я хочу, чтобы пользователь ввел имя, а ему в ответ на это появилось окно с приветствием "Hello, %username%." Но этого не происходит.
вот исходник:
// main.cpp
#include <QtGui>
#include <QMessageBox>
#include <QString>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
qApp->setStyleSheet
(
"QLineEdit {"
"border: 2px solid grey;"
"border-radius: 10px;"
"padding: 0 8 px;"
"selection-background-color: darkgrey;"
"}"
"QPushButton {"
"border: 1px solid #000000;"
"border-radius: 10px;"
"background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,"
"stop: 0 #dedede, stop: 1 #656a6d);"
"min-width: 80px;"
"}"
"QPushButton:pressed {"
"background-color: grey"
"}"
"QPushButton:flat {"
"border: none; "
"}"
);
QWidget window;
window.setGeometry(200, 200, 200, 100);
QLineEdit nameLine(&window);
nameLine.setGeometry(100, 30, 100, 20);
QLabel lbl("Enter your name:", &window);
lbl.setGeometry(5, 30, 100, 20);
QString name = nameLine.text();
QMessageBox messageBox;
messageBox.setGeometry(250, 220, 100, 100);
messageBox.setText(QString ("Hello, %1").arg(name));
QPushButton btn ("OK", &window);
btn.setGeometry(63, 75, 75, 20);
QObject::connect(&btn, SIGNAL(clicked()), &messageBox, SLOT(show()));
window.show ();
return app.exec();
}
Ты просто не так все делаешь.
Вот посмотри пример работы с QLineEdit: http://crossplatform.ru/documentation/qtdoc4.3/widgets-lineedits.php.
Если что-то в нем не будет понятно, спрашивай.
QString name = nameLine.text();
QMessageBox messageBox;messageBox.setGeometry(250, 220, 100, 100);
messageBox.setText(QString ("Hello, %1").arg(name));
xolvo, строчка
QString name = nameLine.text();
копирует пустую строку только что созданного текстового поля.
ок... Ща попробую
рекомендую пройти http://crossplatform.ru/documentation/qtdoc4.3/tutorial.php, вдумчиво.
ндя... событийное программирование, это не фунт изюма...
//lineedit.cpp
#include "lineedit.h"
lineEdit::lineEdit() {
setGeometry(200, 200, 200, 100);
okButton = new QPushButton (tr ("OK"), this);
okButton->setGeometry(63, 75, 75, 20);
lbl = new QLabel (tr ("Enter your name:"), this);
lbl->setGeometry(5, 30, 100, 20);
nmLine = new QLineEdit (this);
nmLine->setGeometry(100, 30, 100, 20);
nmLine->setFocus();
messageBox = new QMessageBox (this);
messageBox->setGeometry(250, 220, 100, 100);
connect ( okButton, SIGNAL(clicked()), messageBox, SLOT(name = nmLine.text()) );
connect ( okButton, SIGNAL(clicked()), messageBox, SLOT(show()) );
}
//lineedit.h
#ifndef LINEEDIT_H
#define LINEEDIT_H
#include <QtGui>
#include "ui_lineedit.h"
class lineEdit : public QWidget
{
Q_OBJECT
public:
lineEdit();
private:
QLineEdit *nmLine;
QPushButton *okButton;
QLabel *lbl;
QMessageBox *messageBox;
QString *name;
};
#endif // LINEEDIT_H
xolvo, так, тутор проходим пожалуйста, понимание слотов и сигналов у тебя по нулям.
Даже не заглядывая в файл реализации, а только в заголовочник сразу вопрос ГДЕ СЛОТ?
Про который я говорил:
Советую написать тебе свой слот mySlot() в котором будет вызываться QMessageBox
и вызывать его из функции main(), либо из конструктора класса так
connect ( okButton, SIGNAL(clicked()), this, SLOT(name = mySlot()) );
Да ксати я вижу что у тебя используется ui файл. но ты не наследуешь свой класс от класса UI::myClass(при условии что так назван класс в ui файле). и не используешь менеджеры компоновки.
Да, кстати из функции main() это делается так
QObject::connect(...)
Это да, ты прав, просто я скопировал его запись и не заметл что там осталось name=
эээ... Я наверно пока почитаю книжек побольше. А потом вернусь к этой теме
Всем спасибо.
xolvo, ты тутор пройди, ту часть, что мы перевели.
в плоть до "Урока 7 - Влияние одного объекта на другие"
Книжки читать никогда не вредно, но советую тебе еще и читать форумы - подчерпнешь для себя много полезного
я его читал... Вроде все понятно и легко. Тока там ничего такого про слоты нету. И про QLineEdit нету
Зато в асистенте есть поиск, а там есть и про слоты, и про QLineEdit
Да кстати советую в качестве учебника почитать Бланшет и Саммерфилда QT4: Программирование GUI на С++,
а в качестве справочника -Макса Шлее(хотя лучше асистента справочника нет, правда он на английском. А где перевод скачать я думаю ты знаешь).
xolvo, предлагаю тебе такое задание:
Сделать только главное окно, пока ни как не реагирующее на нажатие кнопки. Задание с несколькими вариантами. Обязательно должен применятся компоновщик (QLayout)
1) Создание окна в коде
1.1) Используется вертикальный компоновщик, кнопка не должна растягиватся на всю ширину окна.
1.2) Используется сеточный компоновщик, кнопка не должна растягиватся на всю ширину окна.
2) Создание окна в Qt Designer
2.1) Используется вертикальный компоновщик, кнопка не должна растягиватся на всю ширину окна.
2.2) Используется сеточный компоновщик, кнопка не должна растягиватся на всю ширину окна.
подварианты
А) Окно с исходным размером 200*100
Б) Окно с минимальным исходным размером
В) Окно с фиксированым размером 250*150
Выполни эти заданаия и код выкладывай сюда, дальше получишь следующее задание (со слотами и сигналами)
Удаленное обучение, рулез
Именно за отзывчивость людей я люблю этот форум!
Привет всем! А можно глупых вопросов парочку (не хочу плодить глупые вопросы создавая новую тему)?
Сразу скажу в английском я слаб
либо пошлите куда надо, либо объясните пожалуйста.
1. Никак не разберусь с обработкой событий (особенно интересуют события фокуса)
2. Возможно ли создание своих сигналов и как? ()
ЗЫ: может переименовать тему в "Вопросы чайников"?
berserk,
тут на сайте есть Wiki. там на русском много примеров в том числе и полные развернутые ответы на твои вопросы можно найти без труда.
Доброго времени суток. Пол дня голову ломаю, не могу понять в чем пуд соли. Не могу получить текст из QLineEdit, компилится все замечательно, но отваливается на этапе выполнения. Вод собственно код:
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QDialog>
class QLineEdit;
class QPushButton;
class MyDialog : public QDialog
{
Q_OBJECT
public:
explicit MyDialog(QWidget *parent = 0);
protected:
QPushButton *buttonQuit;
QPushButton *buttonOk;
QLineEdit *textInStr;
signals:
public slots:
void ShowMessageBox();
};
#endif // MYDIALOG_H
Реализация:
#include "mydialog.h"
#include <QtGui>
#include <QMessageBox>
MyDialog::MyDialog(QWidget *parent) :
QDialog(parent)
{
QPushButton *buttonQuit = new QPushButton( tr("Quit") );
QPushButton *buttonOk = new QPushButton( tr("Ok") );
QLineEdit *textInStr = new QLineEdit("HELLO");
connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ShowMessageBox() ) );
connect( buttonQuit, SIGNAL( clicked() ), this, SLOT( close() ) );
//connect( textInStr, SIGNAL( textChanged(QString) ), textInStr, SLOT( setText(QString) ) );
QGridLayout *pgrdLayout = new QGridLayout;
pgrdLayout->addWidget(textInStr, 0, 0, 1, 2);
pgrdLayout->addWidget(buttonOk, 0, 2);
pgrdLayout->addWidget(buttonQuit, 1, 2);
setLayout(pgrdLayout);
}
void MyDialog::ShowMessageBox()
{
QString str;
str = textInStr->text();
QMessageBox msgBox;
msgBox.setText( str );
msgBox.exec();
}
У вас дважды созданы объекты.
Нужно так:
MyDialog::MyDialog(QWidget *parent) :
QDialog(parent)
{
buttonQuit = new QPushButton( tr("Quit") );
buttonOk = new QPushButton( tr("Ok") );
textInStr = new QLineEdit("HELLO");
...
Ребята, огромное спасибо!!
Это же нужно так затупить!!)))
Исправил как поправил RazrFalcon и все заработало. Еще раз Спасибо!
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)