Russian Qt Forum
Ноябрь 24, 2024, 14:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигналы и слоты,  (Прочитано 4547 раз)
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");
    }
}

Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #1 : Июль 29, 2010, 21:42 »

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

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

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

Переопредели его в своем редакторе и все получится.
Записан
SimpleSunny
Гость
« Ответ #2 : Июль 29, 2010, 22:08 »

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

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

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

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

А если пользователь мышкой вставит текст?
Записан
UVV
Гость
« Ответ #3 : Июль 30, 2010, 08:35 »

Код:
tn.connect(tn.gettext(), SIGNAL(textChanged()), tn, SLOT(textslot()));
Записан
NicK
Гость
« Ответ #4 : Июль 30, 2010, 09:36 »

а просто валидатор поставить не вариант?
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #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
Гость
« Ответ #6 : Июль 30, 2010, 10:06 »

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

метод setValidator() есть только у QLineEdit. Хотя, возможно, топикстартеру именно его и хотелось бы использовать
Записан
JamS007
Гость
« Ответ #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
Гость
« Ответ #8 : Июль 30, 2010, 12:35 »

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

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


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