powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обработка событий в Qt при добавлении
16 сообщений из 16, страница 1 из 1
Обработка событий в Qt при добавлении
    #38407322
Obsess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица QTableWidget, в которую выводятся несколько десятков тысяч записей.
Чтобы программа не подвисала, вывожу записи по тысяче. Далее, при пролистывании таблицы до конца, автоматически добавляются данные следующими способами:
1. при нажатии pageDown
2. при нажатии стрелки вниз
3. при прокрутке вертикального ScrollBar'a.

Добавление данных в 1-м и 2-м случаях делаю через обработчик событий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{	
    if (obj == ui->tableWidget) {
        if(event->type()==QEvent::KeyPress){
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if ((keyEvent->key()==Qt::Key_PageDown)||(keyEvent->key()==Qt::Key_Down)){
                qDebug()<<"Добавляю данные";
                return true;
            }
        }
    }
    return QObject::eventFilter(obj, event);
}


Для кнопок у ScrollBar, который появляется в TableWidget, я не нашёл никаких событий и поэтому использую сигналы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// при отпускании слайдера
connect(ui->tableWidget->verticalScrollBar(),SIGNAL(sliderReleased()),this,SLOT(handler_scroll_bar()));
// при нажатии на кнопку или в область скроллбара, но не на сам слайдер
connect(ui->tableWidget->verticalScrollBar(),SIGNAL(actionTriggered(int)),this,SLOT(handler_scroll_bar(int))); 

void MainWindow::handler_scroll_bar(int action)
{
    if(action==QAbstractSlider::SliderSingleStepAdd)
        qDebug()<<"Add data";
}


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

Есть ли события QEvent для обработки сигнала от ScrollBar?
Есть ли action для обработки действий при отпускании слайдера?
Можно ли реализовать задачу другим способом?
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38407373
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ObsessМожно ли реализовать задачу другим способом?
Добавлять записи непрерывно в фоновом потоке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38407566
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovObsessМожно ли реализовать задачу другим способом?
Добавлять записи непрерывно в фоновом потоке.


Куда вообще вы все хотите что-то добавлять?

На самом деле всё проще -- надо реализовать свою модель.
(и исползовать TableView, а не TableWidget, естественно).
Там всё будет в твоих руках, всё управление данными.
И не будет тратиться лишняя память.
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38407656
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКуда вообще вы все хотите что-то добавлять?
В локальный кэш, разумеется, поскольку на серверных курсорах далеко не уедешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38407877
Obsess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovДобавлять записи непрерывно в фоновом потоке.

Пробовал, это не подойдёт.
Если сделать фоновый поток, то приложение зависать не будет, но таблица будет пустой, пока происходит добавление. Следовательно, будет непонятно: приложение зависло или выполняет запрос, выводит на экран?

А если во время вывода в таблицу запустить ProgressBar, то последний замирает. При использовании вместе с ProgressBar
Код: plaintext
1.
 qApp->processEvents();

добавление происходит очень медленно.
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38407901
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ObsessЕсли сделать фоновый поток, то приложение зависать не будет, но таблица будет
пустой, пока происходит добавление.
Это проблема в том коде, которым ты добавляешь. Если лень её фиксить, первую сотню записей
можешь добавить в главном потоке, остаток отдать в фоновый.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38407996
Wulff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.
Во первых. Нужно унаследоваться от QAbstractItemModel.
Во вторых. Наследоватяся от QTableView и переопределять свой ScrollBar

Убиваешь 3 зайцев: Ты всегда контролируешь данные.
Вот эта статья думаю тебе поможет http://qtcoder.blogspot.ru/2012/07/qsqlquerymodel-10000.html
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38407997
Wulff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И небольшой совет. Всегда использую свои модели наследованные от QAbtsractModel. Будет меньше головной боли потом.
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38408027
Obsess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivКуда вообще вы все хотите что-то добавлять?

На самом деле всё проще -- надо реализовать свою модель.
(и исползовать TableView, а не TableWidget, естественно).
Там всё будет в твоих руках, всё управление данными.
И не будет тратиться лишняя память.

Добавляю записи в таблицу следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
QSqlQuery MyQuery;
//........................
// выполняется запрос
//.......................
// заполняем табличный виджет данными
while (MyQuery.next())
    {    
        ui->tableWidget->setItem(index,1,new QTableWidgetItem(MyQuery.value(1).toString()));
        ui->tableWidget->setItem(index,2,new QTableWidgetItem(MyQuery.value(2).toString()));        
        index++;
     }


Попробую использовать TableView.
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38408029
Obsess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WulffПривет.
Во первых. Нужно унаследоваться от QAbstractItemModel.
Во вторых. Наследоватяся от QTableView и переопределять свой ScrollBar

Убиваешь 3 зайцев: Ты всегда контролируешь данные.
Вот эта статья думаю тебе поможет http://qtcoder.blogspot.ru/2012/07/qsqlquerymodel-10000.html
Спасибо за статью.
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38408047
Wulff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да не зачто, учите матчасть. Использование QTableWidget не кашерно для большого объема данных.
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38408337
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Obsess...
Во вторых. Наследоватяся от QTableView и переопределять свой ScrollBar


Это совсем не обязательно, на сколько я понимаю.
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38408527
Wulff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не обязательно, по большому счету. Можно в QLayout сделать QTableView и QScrollBar, и тогда не надо наследоватся.
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38408902
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ObsessА если во время вывода в таблицу запустить ProgressBar, то последний замирает. При использовании вместе с ProgressBar
Код: plaintext
1.
 qApp->processEvents();

добавление происходит очень медленно.Если ProgressBar тормозит программу - ты вызываешь слишком часто.

ProgressBar лучше работает вместе с таймером. При старте долгого процесса создаешь PB, замеряешь сколько сейчас времени (момент Х), начинаешь крутить в цикле свой долгий процесс. На каждой итерации процесса двигаешь ползунок в PB, и замеряешь сколько сейчас времени. Если между "сейчас" и Х прошло пол(треть)-секунды, то запускаешь processEvents() и ставишь Х на "сейчас".
Некоторое торможение конечно останется, но оно будет совершенно незаметным. И GUI будет живым.
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38409220
Wulff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlObsessА если во время вывода в таблицу запустить ProgressBar, то последний замирает. При использовании вместе с ProgressBar
Код: plaintext
1.
 qApp->processEvents();

добавление происходит очень медленно.Если ProgressBar тормозит программу - ты вызываешь слишком часто.

ProgressBar лучше работает вместе с таймером. При старте долгого процесса создаешь PB, замеряешь сколько сейчас времени (момент Х), начинаешь крутить в цикле свой долгий процесс. На каждой итерации процесса двигаешь ползунок в PB, и замеряешь сколько сейчас времени. Если между "сейчас" и Х прошло пол(треть)-секунды, то запускаешь processEvents() и ставишь Х на "сейчас".
Некоторое торможение конечно останется, но оно будет совершенно незаметным. И GUI будет живым.
Это идея хорошая. Но я ни разу не сталкивался с такими тормозами.
А по большому счету, человеку жэто не нужно, т.к. он пытается добавлять данные в QWidget ориентированную таблицу, что всегда пахнет жуткими тормозами. Для большого объема данный нужно юзять QAbstractItemModel. И не будет никаких тормозов.
...
Рейтинг: 0 / 0
Обработка событий в Qt при добавлении
    #38411479
chagoserg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли реализовать задачу другим способом?
Contiguous Cache
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обработка событий в Qt при добавлении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]