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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QWidget::repaint() и "грязные" области окна.  (Прочитано 11863 раз)
Индус
Гость
« Ответ #15 : Июль 08, 2015, 17:08 »

Кароче зачем устраивать холивар? Если перед человеком стоит нестандартная задача, то дадим не стандартное решение:
1. создаем два лейбла
2. один лейбл суем в статус бар
3. второй лейбл делаем фреймлесс, и реализуем на нем не стандартную задачу с repaint-ом
4. за одно обвешиваем его костылями чтоб следил за поведением лейбла в статус баре, чтоб всегда рисовался поверх него по его координатам
5. PROFIT!!!  Веселый

P.S. да я мастер костылинга  Смеющийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Июль 08, 2015, 17:34 »

ProcessEvents() перерисует и таблицу. А мне этого нельзя допустить.
Пример
Код
C++ (Qt)
#include <QtWidgets>
 
class MyWin : public QWidget {
public:
MyWin( void ) : testNo(0)
{
resize(320, 240);
QLayout * layout = new QVBoxLayout(this);
setLayout(layout);
lab1 = new QLabel("Lab 1", this);
lab2 = new QLabel("Lab 2", this);
QPushButton * btn = new QPushButton("Test", this);
QObject::connect(btn, &QPushButton::pressed, this, &MyWin::Test);
 
layout->addWidget(lab1);
layout->addWidget(lab2);
layout->addWidget(btn);
}
 
void Test( void )
{
lab2->setUpdatesEnabled(false);
for (int i = 0; i < 5; ++i) {
++testNo;
lab1->setText("Lab1 Test " + QString::number(testNo));
lab2->setText("Lab2 Test " + QString::number(testNo));
qApp->processEvents();
QThread::sleep(1);
}
lab2->setUpdatesEnabled(true);
}
 
// data
int testNo;
QLabel * lab1, * lab2;
};
 
int main( int argc, char **argv )
{
QApplication app(argc, argv);
MyWin * win = new MyWin;
win->show();
app.exec();
}
Записан
ksergey85
Гость
« Ответ #17 : Июль 08, 2015, 18:35 »

Надо понимать, что приведенные мной здесь задачи являются абстрактными, реальный проект гораздо сложнее и отвечающий за обработку событий код раскидан по многим модулям. Обновление метки выполняется внутри слота, который вызывается при срабатывании сигнала изменения состояния одного из классов. В момент работы слота мы не знаем всех таблиц, данные которых были уже обновлены внутри обработчика события. Выявить все виджеты, которым надо проставить setUpdatesEnabled() для меня не представляется возможным к сожалению. Важным моментом является то, каким образом внутри одного обработчика события (то есть не возвращаясь в цикл обработки событий) перерисовать ОДИН КОНКРЕТНЫЙ элемент (виджет) главного окна, так чтобы другие элементы главного окна не были задеты.
Всем кто пытался помочь спасибо. Буду искать обходное решение.
« Последнее редактирование: Июль 08, 2015, 18:41 от ksergey85 » Записан
Bepec
Гость
« Ответ #18 : Июль 08, 2015, 19:11 »

И скорее всего это всё богатство на си? Нужно переписывать и это печальный факт. Всё же разные времена и инструменты требуют разных решений. Кардинально разных.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #19 : Июль 08, 2015, 19:26 »

Имхо, все проблемы из-за неправильного дизайна.
Все данные на момент отрисовки уже должны быть доступны.
Ведь получается, что при банальном интерактивном изменении размера главного окна модель опять полезет за данными куда-то очень далеко. Это разве нормально?
Коли не менять дизайн, то придётся ваять костыли. QWidget::repaint() изначально является его частью.

Но коли очень хочется слепить костыль, то нужно заходить со стороны backing store.
Т.е. заливать содержимое QLabel непосредственно в него через QLabel::render().
Детали зависят от версии Qt.
« Последнее редактирование: Июль 08, 2015, 19:28 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Июль 09, 2015, 11:16 »

Выявить все виджеты, которым надо проставить setUpdatesEnabled() для меня не представляется возможным к сожалению.
"Элементарно, Ватсон" - получить список всех виджетов и задизаблить все кроме "нужного" и всех его парентов.

Важным моментом является то, каким образом внутри одного обработчика события (то есть не возвращаясь в цикл обработки событий) перерисовать ОДИН КОНКРЕТНЫЙ элемент (виджет) главного окна, так чтобы другие элементы главного окна не были задеты.
Это легко достижимо как сказано выше, но вряд ли Вы обойдетесь без событийного цикла. Др словами Вы упорно хотите получить "замороженное UI" даже без кнопки Cancel

Имхо, все проблемы из-за неправильного дизайна.
Все данные на момент отрисовки уже должны быть доступны.
Ведь получается, что при банальном интерактивном изменении размера главного окна модель опять полезет за данными куда-то очень далеко. Это разве нормально?
Ну вообще-то да, нормально. Напр (hex) viewer так и делает, загружает только то что видимо в данный момент. И блокировка промежуточных перерисовок - нормальная практика, еще в старых OC можно было убрать "dirty region". И в Qt это есть - но человек не может смириться с мыслью что просто-напросто "недочитал букварь" и не увидел простую вещь. Отсюда и "надо понимать", "пытался помочь"  Улыбающийся
« Последнее редактирование: Июль 09, 2015, 11:24 от Igors » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #21 : Июль 09, 2015, 11:40 »

Это легко достижимо как сказано выше, но вряд ли Вы обойдетесь без событийного цикла.
Как я выше сказал, вполне себе можно, если напрямую играться с double-buffer.
Записан

Qt 5.11/4.8.7 (X11/Win)
TimothyFado
Гость
« Ответ #22 : Июль 12, 2015, 02:57 »

<a href=http://allelektrika.pro/service/teplypol/>стоимость подключенич и укладки тёплого пола</a>
 
Электрические приборы присутствуют в любом доме и занимают неотъемлемую часть человеческой жизни, Но и с этим не всё легко. Для работоспособности привычных устройств и оборудования требуется провести колоссальную электромонтажную работу, доступную лишь специалистам.
На помощь вам придет команда профессиональных специалистов, работающих в Москве и Подмосковье. Специалисты способны сделать практически всё: от замены розетки и подключения бытовой техники до монтажа электропроводки и электрических полов, а на официальном сайте компании можно приобрести нужные детали для электромонтажа.
 
<a href=http://allelektrika.pro/service/elektroprovodka/>инструмент для монтажа электропроводки</a>
 
Полный список предоставляемых компанией услуг:
Установка светильников;
Установка электроточек;
Монтаж электропроводки;
Установка, подключение и настройка бытовой техники;
 
<a href=http://allelektrika.pro/service/shtroblenie/>штробление стен под проводку цены</a>
 
Комплексные электромонтажные работы.
А также остальные услуги:
Установка теплых полов;
Установка молниезащиты;
Установка заземления;
Установка видеонаблюдения;
Установка слаботочных систем;
Установка противообледенительных систем.
 
<a href=http://allelektrika.pro/service/teplypol/>стоимость подключенич и укладки тёплого пола</a>
 
Специалисты компании – настоящие профессионалы, которым вы можете доверить работы по электромонтажу в квартире. Компания проводит регулярный контроль качества услуг, поэтому вы можете быть полностью спокойны за результат. После нашей установки все приборы будут работать максимально эффективно и долго. Стиральная машина не затопит соседей, посудомоечная машина будет работать бесшумно и мягко.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #23 : Август 22, 2015, 02:28 »

Есть view, он отображает то, что лежит в модели. И есть контроллер, который каким-то образом заполняет модель. Это операции друг с другом не связанные. В принципе контроллер может триггеровать отрисовку view, но view не должен менять содержимое модели иначе, как после редактирования пользователем. Т.е вкратце, отрисовка view должна отображать то, что уже занесено в модель. Понимайте модель в этом случае как нечто константное.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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