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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не получается маленькая программа на основе TextEdit  (Прочитано 3886 раз)
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();
}
« Последнее редактирование: Август 31, 2014, 16:21 от ussed » Записан
Bepec
Гость
« Ответ #1 : Август 31, 2014, 14:18 »

Это печально. Но раз это факт, а не вопрос, то просто пройду мимо Улыбающийся

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

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

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

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

вы  присваиваете массиву '2', а не элементу.
« Последнее редактирование: Август 31, 2014, 16:41 от Bepec » Записан
ussed
Гость
« Ответ #2 : Август 31, 2014, 20:30 »

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

Тут проблема в другом, хотя и эту решили Улыбающийся

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

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

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

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


Записан
Bepec
Гость
« Ответ #4 : Август 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()
{

}
Записан
ussed
Гость
« Ответ #5 : Август 31, 2014, 21:04 »

"Концепция проста - у вас в buf ничего нет. И не было. Вы его не заполняете."
Да ,но я же помещаю по"paste"(правая кнопка мыши) текст.

Зацикливания по моему не должно быть,так как после первой замены уже ничего втексте не будет меняться.
хотя согласен,один дополнительный не рабочий проход будет
Спасибо за предложенное,надо осмыслить,завтра на работе попробую.
« Последнее редактирование: Август 31, 2014, 21:12 от ussed » Записан
Bepec
Гость
« Ответ #6 : Август 31, 2014, 21:07 »

Вы не понимаете...

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

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

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

PS Зацикливание будет. Но рано говорить об этом, вы ещё не видите как работают классы Qt( а точнее вообще не знаете Улыбающийся)
Записан
ussed
Гость
« Ответ #7 : Сентябрь 01, 2014, 17:33 »

Спасибо,работает,только закоментировал "ui:..." он мне не нужен.
Записан
Bepec
Гость
« Ответ #8 : Сентябрь 01, 2014, 18:06 »

На здоровье. Закомментив ui ничего не теряем, так что на здоровье Улыбающийся
Записан
ussed
Гость
« Ответ #9 : Сентябрь 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();
}
« Последнее редактирование: Сентябрь 17, 2014, 21:11 от ussed » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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