Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: не могу получить текст из QLineEdit
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
xolvo
Я новичек в 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();
}


Что я делаю не так?

p.s. И еще QMessageBox как то не правильно работает... Там кнопка "ОК" не такая как в главном окне. Как это исправить??
ViGOur
Ты просто не так все делаешь.
Вот посмотри пример работы с QLineEdit: Line Edits Example.
Если что-то в нем не будет понятно, спрашивай. ;)
Litkevich Yuriy
Цитата(xolvo @ 25.8.2008, 20:31) *
вот исходник

что он слишком большой?
лучше выкладывай на форум вставляй текст между тэгами [code][/code]
xolvo
Цитата(ViGOur @ 25.8.2008, 17:47) *
Ты просто не так все делаешь.
Вот посмотри пример работы с QLineEdit: Line Edits Example.
Если что-то в нем не будет понятно, спрашивай. ;)


Я че то ничего не понял ((  Можешь поправить мой код, что бы правильно было ??

И на скока я понял где-то тут ошибка у меня:

QString name = nameLine.text();
QMessageBox messageBox;messageBox.setGeometry(250, 220, 100, 100);
messageBox.setText(QString ("Hello, %1").arg(name));
Litkevich Yuriy
xolvo, строчка
QString name = nameLine.text();
копирует пустую строку только что созданного текстового поля.

Цитата(xolvo @ 25.8.2008, 20:31) *
Там кнопка "ОК" не такая как в главном окне. Как это исправить??

Ты залез в стили не разобравшись с элементарными вещами.

xolvo, План такой:
1) Создаешь класс собственного виджета, главного окна, в виде отдельной пары файлов cpp/h (по аналогии с примером, что дал ViGOur).
2) в функции main конструируешь обект главного окна (как в упомянутом примере).
3) Весь код сосредотачивается в твоем виджете, в конструкторе соеденяешь сигнал от кнопки со слотом своего виджета.
4) В слоте копируешь текст из тестового поля и показываешь сообщение.

P.S. Про стили пока забудь.
xolvo
ок... Ща попробую
Litkevich Yuriy
рекомендую пройти учебное пособие, вдумчиво.
trdm
ндя... событийное программирование, это не фунт изюма...
xolvo
Цитата(Litkevich Yuriy @ 25.8.2008, 18:27) *
рекомендую пройти учебное пособие, вдумчиво.




я его читал. Вроде все понял.
xolvo
Цитата(Litkevich Yuriy @ 25.8.2008, 18:13) *
xolvo, План такой:
1) Создаешь класс собственного виджета, главного окна, в виде отдельной пары файлов cpp/h (по аналогии с примером, что дал ViGOur).
2) в функции main конструируешь обект главного окна (как в упомянутом примере).
3) Весь код сосредотачивается в твоем виджете, в конструкторе соеденяешь сигнал от кнопки со слотом своего виджета.
4) В слоте копируешь текст из тестового поля и показываешь сообщение.


че то не получается ((
Мож я как то текст из поля не правильно копирую в слоте ??

//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
Litkevich Yuriy
xolvo, так, тутор проходим пожалуйста, понимание слотов и сигналов у тебя по нулям.

Даже не заглядывая в файл реализации, а только в заголовочник сразу вопрос ГДЕ СЛОТ?
Про который я говорил:
Цитата(Litkevich Yuriy @ 25.8.2008, 21:13) *
в конструкторе соеденяешь сигнал от кнопки со слотом своего виджета.
4) В слоте копируешь текст из тестового поля и показываешь сообщение.
molchanoviv
Советую написать тебе свой слот mySlot() в котором будет вызываться QMessageBox
и вызывать его из функции main(), либо из конструктора класса так
connect ( okButton, SIGNAL(clicked()), this, SLOT(name = mySlot()) );

Да ксати я вижу что у тебя используется ui файл. но ты не наследуешь свой класс от класса UI::myClass(при условии что так назван класс в ui файле). и не используешь менеджеры компоновки.


Да, кстати из функции main() это делается так
QObject::connect(...)
Litkevich Yuriy
Цитата(molchanoviv @ 25.8.2008, 23:15) *
connect ( okButton, SIGNAL(clicked()), this, SLOT(name = mySlot()) );

а вот это зря, так должно быть:
connect ( okButton, SIGNAL(clicked()), this, SLOT(mySlot()) );

Цитата(xolvo @ 25.8.2008, 22:43) *
nmLine->setGeometry(100, 30, 100, 20);
Цитата(xolvo @ 25.8.2008, 22:43) *
messageBox->setGeometry(250, 220, 100, 100);
Цитата(xolvo @ 25.8.2008, 22:43) *
okButton->setGeometry(63, 75, 75, 20);

от этого мусора избавься, используй компоновщик (QLayout)
molchanoviv
Это да, ты прав, просто я скопировал его запись и не заметл что там осталось name=
xolvo
эээ... Я наверно пока почитаю книжек побольше. А потом вернусь к этой теме

Всем спасибо. :greeting:
Litkevich Yuriy
xolvo, ты тутор пройди, ту часть, что мы перевели.

в плоть до "Урока 7 - Влияние одного объекта на другие"
molchanoviv
Книжки читать никогда не вредно, но советую тебе еще и читать форумы - подчерпнешь для себя много полезного
xolvo
я его читал... Вроде все понятно и легко. Тока там ничего такого про слоты нету. И про QLineEdit нету
molchanoviv
Зато в асистенте есть поиск, а там есть и про слоты, и про QLineEdit
Да кстати советую в качестве учебника почитать Бланшет и Саммерфилда QT4: Программирование GUI на С++,
а в качестве справочника -Макса Шлее(хотя лучше асистента справочника нет, правда он на английском. А где перевод скачать я думаю ты знаешь).
Litkevich Yuriy
Цитата(xolvo @ 25.8.2008, 23:56) *
Тока там ничего такого про слоты нету

есть!
Litkevich Yuriy
xolvo, предлагаю тебе такое задание:
Сделать только главное окно, пока ни как не реагирующее на нажатие кнопки. Задание с несколькими вариантами. Обязательно должен применятся компоновщик (QLayout)
1) Создание окна в коде
1.1) Используется вертикальный компоновщик, кнопка не должна растягиватся на всю ширину окна.
1.2) Используется сеточный компоновщик, кнопка не должна растягиватся на всю ширину окна.

2) Создание окна в Qt Designer
2.1) Используется вертикальный компоновщик, кнопка не должна растягиватся на всю ширину окна.
2.2) Используется сеточный компоновщик, кнопка не должна растягиватся на всю ширину окна.

подварианты
А) Окно с исходным размером 200*100
Б) Окно с минимальным исходным размером
В) Окно с фиксированым размером 250*150

Выполни эти заданаия и код выкладывай сюда, дальше получишь следующее задание (со слотами и сигналами)
fsMark
Удаленное обучение, рулез :rolleyes:
Именно за отзывчивость людей я люблю этот форум!
berserk
Привет всем! А можно глупых вопросов парочку (не хочу плодить глупые вопросы создавая новую тему)?
Сразу скажу в английском я слаб
либо пошлите куда надо, либо объясните пожалуйста.
1. Никак не разберусь с обработкой событий (особенно интересуют события фокуса)
2. Возможно ли создание своих сигналов и как? ()

ЗЫ: может переименовать тему в "Вопросы чайников"?
kwisp
berserk,
тут на сайте есть Wiki. там на русском много примеров в том числе и полные развернутые ответы на твои вопросы можно найти без труда.
berserk
Цитата(kwisp @ 9.2.2009, 17:51) *
berserk,
тут на сайте есть Wiki. там на русском много примеров в том числе и полные развернутые ответы на твои вопросы можно найти без труда.


спс, посмотрю
я просто первый день ещё не освоился :rolleyes:
Litkevich Yuriy
Цитата(berserk @ 9.2.2009, 20:40) *
2. Возможно ли создание своих сигналов и как? ()
Конечно! читай документацию на русском, и в верху этого подфорума темы "FAQ" и "Быстрый поиск ответов"
(грош цена библиотеке если в ней прикладному програмисту нельзя делать то, что можно разработчику)

Цитата(berserk @ 9.2.2009, 20:40) *
не хочу плодить глупые вопросы создавая новую тему
лучше создать новую тему по узкому вопросу, чем в одной обсуждать около-всяческое (исходи из человека, которому нужно будет искать по форуму)
deep
Доброго времени суток. Пол дня голову ломаю, не могу понять в чем пуд соли. Не могу получить текст из 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();
}

При срабатывании сигнала - "Ошибка выполнения. Память не может быть writen".
Честное слово не пойму :mad:
RazrFalcon
У вас дважды созданы объекты.

Нужно так:
MyDialog::MyDialog(QWidget *parent) :
QDialog(parent)
{
buttonQuit = new QPushButton( tr("Quit") );
buttonOk = new QPushButton( tr("Ok") );
textInStr = new QLineEdit("HELLO");
...
Litkevich Yuriy
Цитата(deep @ 14.6.2011, 19:06) *
При срабатывании сигнала - "Ошибка выполнения. Память не может быть writen".
это говорит о том, что в слоте ты обращаешся по указателю к не существующему объекту
deep
Ребята, огромное спасибо!!
Это же нужно так затупить!!)))

Исправил как поправил RazrFalcon и все заработало. Еще раз Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.