Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
tonx92
8 / 8 / 2
Регистрация: 25.01.2010
Сообщений: 76
1

Как вывести большой объём текста?

03.09.2012, 15:46. Просмотров 1411. Ответов 8
Метки нет (Все метки)

При использовании QTextEdit или QPlainTextEdit
Если попытаться вывести за 1 цикл, текста больше чем помещается в едитку без прокрутки, приложение крашится.
Кто знает как решить проблему? Заранее спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2012, 15:46
Ответы с готовыми решениями:

Большой размер текста в TextEdit qml
Собсно, проблема в следующем: Имеем текстовые файлы, размерами 10 Кб, 100 Кб,...

Как отрисовать большой массив данных
Вобщем столкнулся с проблемой: нужно отрисовать большой массив (2000*8000...

Как фильтровать большой объем данных?
использую QSortFilterProxyModel я вначале загружаю файл, скажем 6 Мегобайт...

Большой объём текста в TMemo
Имеется текстовый файл весом порядка 1 мегабайта Если текст загонять в TMemo...

Вставить в код BAT-файла большой объём воспроизводимого текста с возможностью его быстрого редактирования
Уважаемые эксперты. Здравствуйте, подскажите пожалуйста, как в BAT-файл можно...

8
Humanoid
Почетный модератор
9962 / 3849 / 344
Регистрация: 12.06.2008
Сообщений: 11,363
03.09.2012, 16:07 2
Сейчас попробовал такое:
C++ (Qt)
1
2
3
4
    QString s;
    for (int i=0;i<10000;i++)
        s.append("0123456789");
    ui->textEdit->append(s);
Получается, что за один раз вывел 100 тысяч символов. Приложение подвисло на несколько секунд, но задачу выполнило и не упало. Возможно, у тебя проблема в чём-то другом.
0
tonx92
8 / 8 / 2
Регистрация: 25.01.2010
Сообщений: 76
03.09.2012, 16:10  [ТС] 3
Ну при выводе в консоль всё норм а при выводе в интерфес краш причём только кагда объём большой.
Идёт краш не от большого количества символов а от большого количества строк.
0
Humanoid
Почетный модератор
9962 / 3849 / 344
Регистрация: 12.06.2008
Сообщений: 11,363
03.09.2012, 16:15 4
Цитата Сообщение от tonx92 Посмотреть сообщение
Идёт краш не от большого количества символов а от большого количества строк
Похожий экперимент:
C++ (Qt)
1
2
3
4
    QString s;
    for (int i=0;i<10000;i++)
        s.append("123456789\n");
    ui->textEdit->append(s);
Получается 10 тысяч строк за один раз. Никаких проблем... даже быстрее сработало. Лучше покажи код... 99%, что проблема не в Qt, а где-то в коде.
1
tonx92
8 / 8 / 2
Регистрация: 25.01.2010
Сообщений: 76
03.09.2012, 16:35  [ТС] 5
Вывод у меня получаеся такой
C++
1
2
3
4
5
6
7
8
9
10
11
int b=ilist-1;
int l=list.length();
while(l>=0){
    strlist.prepend(list[l]);
    if(list[l]=='.'){
        label4->append(strlist);
label4->append(QString::number(listsize[b]));
        b--;
        strlist="";}
l--;
}
Весь код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#include <QtCore>
#include <QtGui>
QString path;
QLabel *label,*label1,*label2,*label3;
QTextEdit *label4;
QTreeView *t;
QDockWidget *d1;
QDockWidget *d2;
QDirModel *m;
QTextCodec *codec;
qint64 qnFileCount;
float siz;
QModelIndex cur;
QModelIndex pre;
bool stopped;
bool firststart;
QString list;
QString str;
qint64 listsize[1000];int ilist;
float rou(float fl){fl=fl*100;fl=qRound(fl);fl=fl/100;return fl;}
 
class Sleeper: public QThread
{
 public:static void msleep(int ms)
        { QThread::msleep(ms);}
};
 
void FindFileAndSize( QString szDir)
{ if(stopped==false){
 QDir dir( szDir);
 foreach( QFileInfo fi, dir.entryInfoList())
 {
    QString szFileName = fi.absoluteFilePath();
    if( fi.isDir())
    {
        if( fi.fileName()=="." || fi.fileName()=="..")continue;
        FindFileAndSize( szFileName);
    }
    if( fi.isFile()){qnFileCount++;siz=siz+fi.size();   
    }
 }}
}
void FindFileTypeSize( QString szDir)
{ QString fname;
    if(stopped==false){
 QDir dir( szDir);
 foreach( QFileInfo fi, dir.entryInfoList())
 {
    QString szFileName = fi.absoluteFilePath();
    if( fi.isDir())
    {
        if( fi.fileName()=="." || fi.fileName()=="..")continue;
        FindFileTypeSize( szFileName);
    }
    if( fi.isFile()){fname=fi.fileName();
    if(fname.contains(str)){listsize[ilist]=listsize[ilist]+fi.size();}
 
 
    }
 }}
}
void FindFileType( QString szDir)
{ if(stopped==false){
 QDir dir( szDir);
 foreach( QFileInfo fi, dir.entryInfoList())
 {
    QString szFileName = fi.absoluteFilePath();
    if( fi.isDir())
    {
        if( fi.fileName()=="." || fi.fileName()=="..")continue;
        FindFileType( szFileName);
    }
    if( fi.isFile()){
    str=fi.fileName();
    for(int i=str.length();i>0;i--)
    {
        if(str[i]=='.'){
            str.remove(0,i);
        if(list.contains(str)==false){
            list.append(str);
            
FindFileTypeSize(szDir);
 
 
            ilist++;
        }if(str.length()-i>5){break;}
    };
    };
    }
 }}
}
 
int SubDir( QString szDir)
{ int i;
    if(stopped==false){
 QDir dir( szDir);
 foreach( QFileInfo fi, dir.entryInfoList())
 {
    QString szFileName = fi.absoluteFilePath();
    if( fi.isDir())
    {
        if( fi.fileName()=="." || fi.fileName()=="..")continue;
        i++;
    }
 }}
    return i;
}
 
 class MyThread : public QThread
 {
 public:void run(){
    QString sizeS;QString strlist='.';
    QFileInfo info=m->fileInfo(cur);
    label3->setText(codec->toUnicode("Файлы: идёт поиск Папки: идёт поиск "));
    label2->setText(codec->toUnicode("Размер: идёт поиск "));
    label->setText(codec->toUnicode("Название: ")+m->fileName(cur));
    label1->setText(codec->toUnicode("Полный путь: ")+info.path()+info.fileName());
 
FindFileAndSize(info.path()+info.fileName());
if(siz<999){sizeS=QString::number(siz)+codec->toUnicode(" байт");}
if(siz>999){siz=siz/1024;sizeS=QString::number(rou(siz))+codec->toUnicode(" Кбайт");}
if(siz>999){siz=siz/1024;sizeS=QString::number(rou(siz))+codec->toUnicode(" Мбайт");}
if(siz>999){siz=siz/1024;sizeS=QString::number(rou(siz))+codec->toUnicode(" Гб");}
    label2->setText(codec->toUnicode("Размер: ")+sizeS);
    label3->setText(codec->toUnicode("Файлы: ")+QString::number(qnFileCount)+codec->toUnicode("шт. Папки: ")+QString::number(SubDir(info.path()+info.fileName()))+codec->toUnicode("шт."));
FindFileType(info.path()+info.fileName());
 
int b=ilist-1;
int l=list.length();
while(l>=0){
    strlist.prepend(list[l]);
    if(list[l]=='.'){
        label4->append(strlist);
label4->append(QString::number(listsize[b]));
        b--;
        strlist="";}
l--;
}       
    firststart=true;stopped=false;
    }
};
 
MyThread TR;
void    QTreeView::currentChanged ( const QModelIndex & current, const QModelIndex & previous ){
t->setCursor(Qt::WaitCursor);
    stopped=true;
    if(firststart==true){stopped=false;firststart=false;}
    while(stopped==true);
siz=0;
list="";
qnFileCount=0;
ilist=0;
for(int i=0;i<100;i++){listsize[i]=0;}
label4->clear();
    cur=current;
    pre=previous;
    TR.start();
    t->setCursor(Qt::ArrowCursor);
}
 
int main(int argc, char *argv[])
{    codec = QTextCodec::codecForName("windows-1251");
     QApplication app(argc, argv);
     firststart=true;
     QMainWindow w;
     t=new QTreeView();
     d1=new QDockWidget;
     d2=new QDockWidget;
     QWidget *hide1=new QWidget;
     QWidget *hide2=new QWidget;
     m = new QDirModel;
     label=new QLabel;
     label1=new QLabel;
     label2=new QLabel;
     label3=new QLabel;
     label4=new QTextEdit();
     label4->setReadOnly(true);
     QVBoxLayout* box=new QVBoxLayout();
     QGroupBox *groupBox = new QGroupBox(codec->toUnicode("Свойства:"));
     d1->setTitleBarWidget(hide1);
     d2->setTitleBarWidget(hide2);
     
     t->setModel(m);
     box->addWidget(label);
     box->addWidget(label1);
     box->addWidget(label2);
     box->addWidget(label3);
     box->addWidget(label4);
     groupBox->setLayout(box);
     
     d1->setWidget(t);
     d2->setWidget(groupBox);
     
     w.addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea,d1);
     w.addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea,d2);
     
     w.resize(1000,500);
     m->setFilter(QDir::Filter::AllDirs);
    w.show();
 
    
     return app.exec();
 };
Выводит информацию по выбранной папке по каждому расширению ошибка именно в этом куске
0
Humanoid
Почетный модератор
9962 / 3849 / 344
Регистрация: 12.06.2008
Сообщений: 11,363
03.09.2012, 17:02 6
Сразу бросается в глаза
Цитата Сообщение от tonx92 Посмотреть сообщение
C++
1
2
3
int l=list.length();
while(l>=0){
  strlist.prepend(list[l]);
При первом проходе будет обращение к list[list.length()]... но нумерация начинается с нуля, поэтому этот элемент уже выходит на границы. Надо 2 строку в твоём коде заменить на
C++
1
int l=list.length()-1;
0
tonx92
8 / 8 / 2
Регистрация: 25.01.2010
Сообщений: 76
03.09.2012, 17:08  [ТС] 7
Он там при выходе за границы нечево не берёт ошибка конечно.
Но проблема в другом.
0
Humanoid
Почетный модератор
9962 / 3849 / 344
Регистрация: 12.06.2008
Сообщений: 11,363
03.09.2012, 18:58 8
Лучший ответ Сообщение было отмечено как решение

Решение

Тут ещё всё идёт через отдельный поток... недавно была похожая тема... и тут, скорее всего, та же история: нельзя работать с виджетами напрямую из другого потока. Когда что-то быстро происходит, то может проскочить... а когда дольше, то может глюконуть. Поток с окном должен взаимодействовать через сигналы/слоты.
3
tonx92
8 / 8 / 2
Регистрация: 25.01.2010
Сообщений: 76
03.09.2012, 19:14  [ТС] 9
Ясно спасибо
0
03.09.2012, 19:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2012, 19:14

Как скопировать большой объём данных с проверкой на ошибки?
Здравствуйте! Есть 2 диска - внешний и внутренний! На обоих их них много...

Вывести большой кусок текста
Необходимо вывести большой кусок текста пользователю, но richtextBox не может...

Большой объём данных
В общем, есть проект, игра, жанр стратегия, варгейм, только в онлайн режиме и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru