Russian Qt Forum

Qt => Вопросы новичков => Тема начата: ussed от Август 31, 2014, 14:09



Название: Не получается маленькая программа на основе TextEdit
Отправлено: ussed от Август 31, 2014, 14:09
В текстовое поле из clipboard помещается текст,
в нем все буквы 'a' поменять на буквы 'b'
Код:
//maiwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>
#include <QMainWindow>
#include <QPlainTextEdit>
#include <QAction>
#include <QByteArray>
#include <QLabel>
#include <QErrorMessage>

QT_BEGIN_NAMESPACE

class QPlainTextEdit;

QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QByteArray buf;
    QErrorMessage lbl;

private:
    QPlainTextEdit *textEdit;
private slots:
   void myslot()
        {
            lbl.showMessage("hhh");
            lbl.exec();
            //delay 5 sec
            for(int i=0;i<buf.size();i++)
            {
                 if (buf.at(i) == '1')
                      buf = '2';
            }
        }

};

#endif // MAINWINDOW_H
---------------------
//mainwindow.cpp
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    buf.resize(1000);
    textEdit = new QPlainTextEdit(buf);

    setCentralWidget(textEdit);
    connect(textEdit->document(),SIGNAL(textChanged()),this,SLOT(myslot()));

}

MainWindow::~MainWindow()
{
;
}
//////fffffaaccccc
/*
    if( textEdit->canPaste())
    {
        lbl.showMessage("hhh");
       // lbl.exec();
        //delay 5 sec
        for(int i=0;i<buf.size();i++)
        {
             if (buf.at(i) == 'a')
                  buf = 'b';
        }
 
    }
 */-------------------------
//main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}


Название: Re: Не получается маленькая программа на основе TextEdit
Отправлено: Bepec от Август 31, 2014, 14:18
Это печально. Но раз это факт, а не вопрос, то просто пройду мимо :)

PS оформляем код в тег кнопкой "#" на панельке.

update: Прекрасно, уже красивее. А теперь осталось добавить вопрос / просьбу/ обсуждение. Привести проблему. Если есть ошибки, привести полный текст ошибки.

update_2: теперь, в вышеприведённом коде, оформленном нормально я сразу вижу ошибку. Но вышенаписанное всё же сделайте. Вы же хотите, чтоб вам помогали :)

Ошибка у вас в том, что в
Код:
if (buf.at(i) == '1')
                      buf = '2';

вы  присваиваете массиву '2', а не элементу.


Название: Re: Не получается маленькая программа на основе TextEdit
Отправлено: ussed от Август 31, 2014, 20:30
Посьба помочь решить задачу!
Конечно buf='2'; так в исходном коде.
но при переносе кода в '#' пропали квадратные скобки .
При построении никаких ошибок не показано.
Самое главное OS Archlinux(64),Qt 5.3;
При помещении тестовой строки в окно ,не происходит
ожидаемой замены.
Наставление для новичков настраивает на лаконичность.


Название: Re: Не получается маленькая программа на основе TextEdit
Отправлено: Bepec от Август 31, 2014, 20:42
Тут проблема в другом, хотя и эту решили :)

Концепция проста - у вас в buf ничего нет. И не было. Вы его не заполняете.

QPlainTextEdit'у в конструкторе передаётся строка, которую он помещает В себя и потом напрочь о ней забывает.

В результате у вас при запуске buf пуст более, чем полностью. Что делать?
(псс: делаю скидку на 1 тему, так сказать Welcome)

ps счас накропаю рабочий проект, 5 минут.




Название: Re: Не получается маленькая программа на основе TextEdit
Отправлено: Bepec от Август 31, 2014, 20:55
Ошибки -
непонимание работы QPlainTextEdit и неправильное соединение
connect(textEdit->document(),SIGNAL(textChanged()),this,SLOT(myslot()));

Что ещё? Ещё не учтено зацикливание.
При изменении текста будет испускаться сигнал изменения и вызываться слот, который будет изменять текст и будет испускаться сигнал изменения и вызываться слот, который будет изменять текст и будет испускаться сигнал изменения и вызываться слот, который будет изменять текст и будет испускаться сигнал изменения и вызываться слот, который будет изменять текст и... Ну и так до переполнения и вылета :)

Проблема решается стражем - boolean переменной, которая при работе слота блокируется и разблокируется в конце.


h
Код:
#ifndef TESTPLAIN_H
#define TESTPLAIN_H

#include <QtWidgets/QMainWindow>
#include <QPlainTextEdit>
#include "ui_testplain.h"


class testPlain : public QMainWindow
{
Q_OBJECT

public:
testPlain(QWidget *parent = 0);
~testPlain();

private:
Ui::testPlainClass ui;
QPlainTextEdit * textEdit;
bool work;

private slots:
void mySlot()
{
if (!work)
{
work = true;
QString content = textEdit->toPlainText();
content.replace("a", "b");
textEdit->clear();
textEdit->appendPlainText(content);
work = false;
}
}
};

#endif // TESTPLAIN_H
cpp
Код:
#include "testplain.h"

testPlain::testPlain(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
textEdit = new QPlainTextEdit;
work = false;
    setCentralWidget(textEdit);
    connect(textEdit,SIGNAL(textChanged()),this,SLOT(mySlot()));
}

testPlain::~testPlain()
{

}


Название: Re: Не получается маленькая программа на основе TextEdit
Отправлено: ussed от Август 31, 2014, 21:04
"Концепция проста - у вас в buf ничего нет. И не было. Вы его не заполняете."
Да ,но я же помещаю по"paste"(правая кнопка мыши) текст.

Зацикливания по моему не должно быть,так как после первой замены уже ничего втексте не будет меняться.
хотя согласен,один дополнительный не рабочий проход будет
Спасибо за предложенное,надо осмыслить,завтра на работе попробую.


Название: Re: Не получается маленькая программа на основе TextEdit
Отправлено: Bepec от Август 31, 2014, 21:07
Вы не понимаете...

Чтобы заполнить массив надо сделать
buf =

У вас в коде где нибудь ДО момента замены оно встречается?

Массив buf НЕ связан с QPlainTextEdit. QPlainTextEdit даже не знает о его существовании, ибо в конструкторе происходит неявная инициализация класса QString, которое превращает buf в локальную QString и помещает в QPlainTextEdit.

PS Зацикливание будет. Но рано говорить об этом, вы ещё не видите как работают классы Qt( а точнее вообще не знаете :))


Название: Re: Не получается маленькая программа на основе TextEdit
Отправлено: ussed от Сентябрь 01, 2014, 17:33
Спасибо,работает,только закоментировал "ui:..." он мне не нужен.


Название: Re: Не получается маленькая программа на основе TextEdit
Отправлено: Bepec от Сентябрь 01, 2014, 18:06
На здоровье. Закомментив ui ничего не теряем, так что на здоровье :)


Название: Re: Не получается маленькая программа на основе TextEdit
Отправлено: ussed от Сентябрь 17, 2014, 21:09
В принципе работает!
но есть вопросы. Если строку в mainwindow.h " work = true;"перенести на строку после "textEdit->setPlainText(content);"
то задача вылетает.С точки зрения процедурного программирования этот перенос совершенно нейтральный.
Код:
#ifndef TESTPLAIN_H
#define TESTPLAIN_H

#include <QtWidgets/QMainWindow>
#include <QPlainTextEdit>
#include <QDebug>
#include <QTextCodec>
#include <QChar>
#include <QTextStream>
#include <string.h>
#include <stdlib.h>


class testPlain : public QMainWindow
{
    Q_OBJECT

public:
    testPlain(QWidget *parent=0);
    ~testPlain();
private:
    QPlainTextEdit * textEdit;
    bool work;
    QString content;
    QByteArray bf;
    int transform_content(QString &content);

private slots:
    void mySlot()
    {
        if (!work)
        {
            content=textEdit->toPlainText();
            work = true;
         // QTest::qWait(10000);
            transform_content(content);
            textEdit->clear();
            textEdit->setPlainText(content);

        }
    }
};

#endif // TESTPLAIN_H
//=======================
#include "mainwindow.h"

testPlain::testPlain(QWidget  *parent)
    : QMainWindow(parent)
{
    textEdit = new QPlainTextEdit;
    bf.resize(1000);
    work = false;
    setCentralWidget(textEdit);
    connect(textEdit,SIGNAL(textChanged()),this,SLOT(mySlot()));
}

testPlain::~testPlain()
{

}
int testPlain::transform_content(QString &content)
{
    int i,j;
    bf=content.toLocal8Bit();
    i=bf.size();
    float par1,par2,par3,par4,par5,par6,z1,z2,z3;//,a,b;
    j=0;
    for(i=bf.size();i>0;i--)
    {
        if( qstrncmp( "tion",bf.data()+i,4)==0 && !j)
        {
            j++;
            i--;
        }
        if( qstrncmp( "tion",bf.data()+i,4)==0 && j==1)
        {;
            sscanf((char*)(bf.data()+i),"tion %f %f %f %*s",&par1,&par2,&z1);
            j++;
            i--;
        }
        if( qstrncmp( "tion",bf.data()+i,4)==0 && j==2)
        {
            sscanf((char*)(bf.data()+i),"tion %f %f %f %*s",&par3,&par4,&z2);
            j++;
            i--;
        }
        if( qstrncmp( "tion",bf.data()+i,4)==0 && j==3)
        {
            j++;
            i--;
        }
        if( qstrncmp( "tion",bf.data()+i,4)==0 && j==4)
        {
            sscanf((char*)(bf.data()+i),"tion %f %f %f %*s",&par5,&par6,&z3);
            j++;
            i--;
        }

        if(j==5)
            break;
    }
    bf.clear();
    QTextStream(&bf)<<"par1"<<par1;

    content.clear();
    content.prepend(bf);

    return 0;
}
//========================================
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    testPlain w;
    w.show();
    return a.exec();
}