Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: diduz от Июль 29, 2010, 21:25



Название: Сигналы и слоты,
Отправлено: diduz от Июль 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");
    }
}



Название: Re: Сигналы и слоты,
Отправлено: Mikhail от Июль 29, 2010, 21:42
Зачем же так извращаться.

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

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

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


Название: Re: Сигналы и слоты,
Отправлено: SimpleSunny от Июль 29, 2010, 22:08
Зачем же так извращаться.

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

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

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

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


Название: Re: Сигналы и слоты,
Отправлено: UVV от Июль 30, 2010, 08:35
Код:
tn.connect(tn.gettext(), SIGNAL(textChanged()), tn, SLOT(textslot()));


Название: Re: Сигналы и слоты,
Отправлено: NicK от Июль 30, 2010, 09:36
а просто валидатор поставить не вариант?


Название: Re: Сигналы и слоты,
Отправлено: Mikhail от Июль 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.


Название: Re: Сигналы и слоты,
Отправлено: whirlwind от Июль 30, 2010, 10:06
а просто валидатор поставить не вариант?

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


Название: Re: Сигналы и слоты,
Отправлено: JamS007 от Июль 30, 2010, 12:33
Народ, что вы накинулись, человк же написал, что только начинает изучать Qt и по видимум С++ тоже. Отнеситесь с пониманием к этому.

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

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

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

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


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


Название: Re: Сигналы и слоты,
Отправлено: diduz от Июль 30, 2010, 12:36
спасибо JamS007