Size: a a a

2020 June 04

IM

Ian Mcewan in Qt
товарищи, не подскажите действенный способ сохранять соотношение сторон виджета при изменении размера? в интернете рецепты не помогают, а-ля задавать политику размеров, sizeHint, heigthForWidth и прочее
источник

Eあ

Elnee あめ in Qt
Stas Koynov
в каком том случае? нужен полный минимальный кусок кода воспроизводящий проблему. а так это до аллах-акбара не далеко. магия ванга и т.п
Удалось найти корень проблемы. Я сконектил QThread::finished с QObject::deleteLater этого треда. И видимо внутренности QMutex уже разрушаются на момент вызова QMutex::lock который крашил. Догадался я до этого по сурсам Qt и увидел что причина моего краша в конечном счёте это доступ к QMutexData которая  уже очищена внутри самого QMutex. Теперь краша нет. Каждый раз когда подобную ошибку удаётся разрешить не чувствую ничего кроме прострации.
источник

WB

W Bear in Qt
Ian Mcewan
товарищи, не подскажите действенный способ сохранять соотношение сторон виджета при изменении размера? в интернете рецепты не помогают, а-ля задавать политику размеров, sizeHint, heigthForWidth и прочее
1) Определись с соотношением сторон
2) Определись с ведущей и ведомой стороной
3) Выставляй в paintEvent либо по событию изменения виджета ведомую сторону
источник

IM

Ian Mcewan in Qt
W Bear
1) Определись с соотношением сторон
2) Определись с ведущей и ведомой стороной
3) Выставляй в paintEvent либо по событию изменения виджета ведомую сторону
спасибо
источник

SK

Stas Koynov in Qt
Elnee あめ
Удалось найти корень проблемы. Я сконектил QThread::finished с QObject::deleteLater этого треда. И видимо внутренности QMutex уже разрушаются на момент вызова QMutex::lock который крашил. Догадался я до этого по сурсам Qt и увидел что причина моего краша в конечном счёте это доступ к QMutexData которая  уже очищена внутри самого QMutex. Теперь краша нет. Каждый раз когда подобную ошибку удаётся разрешить не чувствую ничего кроме прострации.
И зря!. Отрицательный результат иногда учит больше чем положительный.
источник

Eあ

Elnee あめ in Qt
Stas Koynov
И зря!. Отрицательный результат иногда учит больше чем положительный.
Это правда
источник

t

tempmozer@gmail.com in Qt
Здравствуйте, не подскажите почему не работает регулярное выражение

QRegExp re("\{(.*?)\}");
int lastPos = 0;
while( ( lastPos = re.indexIn( table, lastPos ) ) != -1 ) {
lastPos += re.matchedLength();
qDebug() << re.cap( 0 ) << ":" << re.cap( 1 );
}

table =
{"...."},{"...."},{"...."}
источник

SK

Serguei Khvatov in Qt
.*? — это что должно означать?
источник

AS

Anatoly Shirokov in Qt
Переслано от Anatoly Shirokov
#thread #logger Ребят, я здесь набросал логгер, который помогает анализировать многопоточные программы, за счет удобной визуализации лога каждого треда в виде отдельного столбца. Вообщем, для всех, кто изучает многопоточку и асинхрон будет полезно. https://gist.github.com/anatoly-spb/3e000186075efb7d05f078d42a5f9bf0

пример использования:
#include "pretty_thread_logger.h"

#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>

namespace example
{
 std::mutex condvar_mutex;
 std::condition_variable condvar;
 bool product = false;

 void producer()
 {
   using namespace std::chrono_literals;
   pretty_thread_logger::info("producer enter");
   pretty_thread_logger::info("std::this_thread::sleep_for(2s);");
   std::this_thread::sleep_for(2s);
   pretty_thread_logger::info("std::lock_guard<std::mutex> guard{ condvar_mutex };");
   std::lock_guard<std::mutex> guard{ condvar_mutex };
   pretty_thread_logger::info("product = true;");
   product = true;
   pretty_thread_logger::info("condvar.notify_all();");
   condvar.notify_all();
   pretty_thread_logger::info("producer leave");
 }

 void consumer()
 {
   using namespace std::chrono_literals;
   pretty_thread_logger::info("consumer enter");
   pretty_thread_logger::info("std::unique_lock<std::mutex> exit_locker{ condvar_mutex };");
   std::unique_lock<std::mutex> locker{ condvar_mutex };
   pretty_thread_logger::info("condvar.wait");
   condvar.wait(locker, []()
     {
       return product;
     });
   pretty_thread_logger::info("consumer leave");
 }
 void test()
 {
   pretty_thread_logger::info("test enter");
   pretty_thread_logger::info("create producer");
   std::thread p{ producer };
   pretty_thread_logger::info("create consumer 1");
   std::thread c1{ consumer };
   pretty_thread_logger::info("create consumer 2");
   std::thread c2{ consumer };
   pretty_thread_logger::info("wait for producer done");
   p.join();
   pretty_thread_logger::info("wait for consumer 1 done");
   c1.join();
   pretty_thread_logger::info("wait for consumer 2 done");
   c2.join();
   pretty_thread_logger::info("test leave");
 }
}

int main() {
 example::test();
 pretty_thread_logger::set_thread_column_width(30);
 pretty_thread_logger::show(std::cout);
}
источник

AS

Anatoly Shirokov in Qt
Переслано от Anatoly Shirokov
источник

t

tempmozer@gmail.com in Qt
Serguei Khvatov
.*? — это что должно означать?
Любое значение
источник

SK

Serguei Khvatov in Qt
tempmozer@gmail.com
Любое значение
А ленивые квантификаторы в Qt есть?
источник

Eあ

Elnee あめ in Qt
Anatoly Shirokov
Переслано от Anatoly Shirokov
#thread #logger Ребят, я здесь набросал логгер, который помогает анализировать многопоточные программы, за счет удобной визуализации лога каждого треда в виде отдельного столбца. Вообщем, для всех, кто изучает многопоточку и асинхрон будет полезно. https://gist.github.com/anatoly-spb/3e000186075efb7d05f078d42a5f9bf0

пример использования:
#include "pretty_thread_logger.h"

#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>

namespace example
{
 std::mutex condvar_mutex;
 std::condition_variable condvar;
 bool product = false;

 void producer()
 {
   using namespace std::chrono_literals;
   pretty_thread_logger::info("producer enter");
   pretty_thread_logger::info("std::this_thread::sleep_for(2s);");
   std::this_thread::sleep_for(2s);
   pretty_thread_logger::info("std::lock_guard<std::mutex> guard{ condvar_mutex };");
   std::lock_guard<std::mutex> guard{ condvar_mutex };
   pretty_thread_logger::info("product = true;");
   product = true;
   pretty_thread_logger::info("condvar.notify_all();");
   condvar.notify_all();
   pretty_thread_logger::info("producer leave");
 }

 void consumer()
 {
   using namespace std::chrono_literals;
   pretty_thread_logger::info("consumer enter");
   pretty_thread_logger::info("std::unique_lock<std::mutex> exit_locker{ condvar_mutex };");
   std::unique_lock<std::mutex> locker{ condvar_mutex };
   pretty_thread_logger::info("condvar.wait");
   condvar.wait(locker, []()
     {
       return product;
     });
   pretty_thread_logger::info("consumer leave");
 }
 void test()
 {
   pretty_thread_logger::info("test enter");
   pretty_thread_logger::info("create producer");
   std::thread p{ producer };
   pretty_thread_logger::info("create consumer 1");
   std::thread c1{ consumer };
   pretty_thread_logger::info("create consumer 2");
   std::thread c2{ consumer };
   pretty_thread_logger::info("wait for producer done");
   p.join();
   pretty_thread_logger::info("wait for consumer 1 done");
   c1.join();
   pretty_thread_logger::info("wait for consumer 2 done");
   c2.join();
   pretty_thread_logger::info("test leave");
 }
}

int main() {
 example::test();
 pretty_thread_logger::set_thread_column_width(30);
 pretty_thread_logger::show(std::cout);
}
Спасибо большое, для наглядности отлично просто
источник

t

tempmozer@gmail.com in Qt
Serguei Khvatov
А ленивые квантификаторы в Qt есть?
Без понятия, я решил использовать std::regex
источник

Eあ

Elnee あめ in Qt
tempmozer@gmail.com
Здравствуйте, не подскажите почему не работает регулярное выражение

QRegExp re("\{(.*?)\}");
int lastPos = 0;
while( ( lastPos = re.indexIn( table, lastPos ) ) != -1 ) {
lastPos += re.matchedLength();
qDebug() << re.cap( 0 ) << ":" << re.cap( 1 );
}

table =
{"...."},{"...."},{"...."}
Используйте QRegularExpression вместо устаревшего QRegExp
источник

Eあ

Elnee あめ in Qt
tempmozer@gmail.com
Здравствуйте, не подскажите почему не работает регулярное выражение

QRegExp re("\{(.*?)\}");
int lastPos = 0;
while( ( lastPos = re.indexIn( table, lastPos ) ) != -1 ) {
lastPos += re.matchedLength();
qDebug() << re.cap( 0 ) << ":" << re.cap( 1 );
}

table =
{"...."},{"...."},{"...."}
Здесь также может после .* всё схлопнуться в одну группу. Возможно вам нужно что-то такое:
\{([^\{\}]*)\}
источник

Eあ

Elnee あめ in Qt
Это вычленит группы правильно из подобного примера.
источник

Eあ

Elnee あめ in Qt
Используйте сайт типа regex101.com для проверки регулярных выражений
источник

t

tempmozer@gmail.com in Qt
Elnee あめ
Здесь также может после .* всё схлопнуться в одну группу. Возможно вам нужно что-то такое:
\{([^\{\}]*)\}
Спасибо
источник

SK

Serguei Khvatov in Qt
Elnee あめ
Здесь также может после .* всё схлопнуться в одну группу. Возможно вам нужно что-то такое:
\{([^\{\}]*)\}
Тут специально на этот случай заказан "ленивый" (lazy) квантификатор *? Вопрос в том, реализован ли он.
Не поленился, заглянул в документацию. Там всё мутно, но похоже, что нет — ни в QRegExp, ни в QRegularExpression.
Кстати, про std::regexp я тоже не уверен
источник