Russian Qt Forum
Февраль 10, 2012, 15:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигналы и слоты,  (Прочитано 887 раз)
diduz
Новичок

Offline Offline

Сообщений: 12


« : Июль 29, 2010, 21:25 »

Здравствуйте,недавно начал изучать QT, хочу написать простую прогу->окошко с 2 QTextEdit в 1 можно вводить все а в другое только цифры.проблема: поймать момент когда пользователь вводит тект в QTextEdit, я знаю о сигнале textChanged() но я создавал свои класс и из него уже не могу воспользоваться этим сигналом.
Код:
#include "Textnum.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Textnum tn;
    tn.connect(tn.gettext(),SIGNAL(tn.gettext().textChanged()),tn,SLOT(textslot()));//собственно тут //проблема ,строка с ошибкой, как исправить не знаю.
    tn.show();


    return app.exec();
}

//========================================================
#ifndef TEXTNUM_H
#define TEXTNUM_H

#include <QtGui>

class Textnum : public QWidget {
    Q_OBJECT
private:
    QLabel* lblText;
    QTextEdit* txtText;
    QLabel* lblNum;
    QTextEdit* txtNum;

public:

    Textnum(QWidget* pwgt=0);
    bool Checknum();
    QTextEdit gettext();




public slots:
    void textslot();
};

#endif // TEXTNUM_H
//===================================================

#include "Textnum.h"

Textnum::Textnum(QWidget *pwgt):QWidget(pwgt){
    lblText= new QLabel("&Text and Num");
    txtText= new QTextEdit();
    lblText->setBuddy(txtText);
    lblNum = new QLabel("&Num");
    txtNum=new QTextEdit("546");
    lblNum->setBuddy(txtNum);

    QVBoxLayout* vbl1= new QVBoxLayout;
    vbl1->addWidget(lblText);
    vbl1->addWidget(txtText);
    QVBoxLayout* vbl2= new QVBoxLayout;
    vbl2->addWidget(lblNum);
    vbl2->addWidget(txtNum);

    QHBoxLayout* hblayout= new QHBoxLayout;
    hblayout->addLayout(vbl1);
    hblayout->addLayout(vbl2);
    setLayout(hblayout);

   


}
bool Textnum::Checknum(){
    QString str;
    QPalette pal=txtNum->palette();
    bool f=true;
    str=txtNum->toPlainText();
    for(int i=0;i<str.length();++i){
        if(str.at(i).isNumber()){
        }
        else{
            f=false;
        }
    }
    return f;
}
QTextEdit Textnum::gettext(){
    return txtNum;
}
Textnum::textslot(){

    if(Checknum()){
        QMessageBox::information(0,"this","num");
    }
    else{
        QMessageBox::information(0,"this","notnum");
    }
}

Записан
Mikhail
Бывалый
*****
Offline Offline

Сообщений: 473


WWW
« Ответ #1 : Июль 29, 2010, 21:42 »

Зачем же так извращаться.

Есть такой метод для QTextEdit

void QTextEdit::keyPressEvent ( QKeyEvent * e )   [virtual protected]

Переопредели его в своем редакторе и все получится.
Записан

SimpleSunny
Крякер
****
Online Online

Сообщений: 357


Малевич


« Ответ #2 : Июль 29, 2010, 22:08 »

Зачем же так извращаться.

Есть такой метод для QTextEdit

void QTextEdit::keyPressEvent ( QKeyEvent * e )   [virtual protected]

Переопредели его в своем редакторе и все получится.

А если пользователь мышкой вставит текст?
Записан

"There must have been a moment at the beginning, where we could have said no. But somehow we missed it. Well, we'll know better next time." ©
Vyacheslav Yurkov
Крякер
****
Offline Offline

Сообщений: 327


« Ответ #3 : Июль 30, 2010, 08:35 »

Код:
tn.connect(tn.gettext(), SIGNAL(textChanged()), tn, SLOT(textslot()));
Записан
NicK
Самовар
**
Offline Offline

Сообщений: 102


« Ответ #4 : Июль 30, 2010, 09:36 »

а просто валидатор поставить не вариант?
Записан
Mikhail
Бывалый
*****
Offline Offline

Сообщений: 473


WWW
« Ответ #5 : Июль 30, 2010, 09:42 »

Зачем же так извращаться.

Есть такой метод для QTextEdit

void QTextEdit::keyPressEvent ( QKeyEvent * e )   [virtual protected]

Переопредели его в своем редакторе и все получится.

А если пользователь мышкой вставит текст?

Для этого случая переопределить следующий слот

void QTextEdit::paste ()   [slot]

Pastes the text from the clipboard into the text edit at the current cursor position.
If there is no text in the clipboard nothing happens.
To change the behavior of this function, i.e. to modify what QTextEdit can paste and how it is being pasted, reimplement the virtual canInsertFromMimeData() and insertFromMimeData() functions.
Записан

whirlwind
Чайник
*
Offline Offline

Сообщений: 92


« Ответ #6 : Июль 30, 2010, 10:06 »

а просто валидатор поставить не вариант?

метод setValidator() есть только у QLineEdit. Хотя, возможно, топикстартеру именно его и хотелось бы использовать
Записан
HaySayCheese
Самовар
**
Offline Offline

Сообщений: 154



« Ответ #7 : Июль 30, 2010, 12:33 »

Народ, что вы накинулись, человк же написал, что только начинает изучать Qt и по видимум С++ тоже. Отнеситесь с пониманием к этому.

Код:
tn.connect(tn.gettext(),SIGNAL(tn.gettext().textChanged()),tn,SLOT(textslot()))

вот этот код луше перенести в конструктор класса (если не знаешь что это - почитай в инете, или пиши в ЛС), и немного причесать Улыбающийся, что-то типа такого:

Код:
connect(this->lineEdit1,SIGNAL(textChanged()),this,SLOT(textslot()))

Прости, твой код не перечитывал, но, думаю, смысл понятен.
Записан
diduz
Новичок

Offline Offline

Сообщений: 12


« Ответ #8 : Июль 30, 2010, 12:35 »

Спасибо что так быстро откликнулись, я теперь знаю о существовании валидаторов и keyPressEvent Улыбающийся
Но моя цель была разобраться с сигналами и слотами, решил проблему прописав
Код:
connect(txtNum,SIGNAL(textChanged()),SLOT(textslot()));
в классе непосредственно после создания QTextEdit.
Записан
diduz
Новичок

Offline Offline

Сообщений: 12


« Ответ #9 : Июль 30, 2010, 12:36 »

спасибо JamS007
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.037 секунд. Запросов: 22.