Просмотр сообщений
|
Страниц: [1] 2
|
1
|
Qt / QSS / QTreeWidget и цвет выделения
|
: Ноябрь 25, 2016, 16:30
|
Здравствуйте! Как можно изменить цвет выделения элементов дерева, но чтобы он при этом остался полупрозрачным? http://imgur.com/a/PqgACНа скриншоте указатель мыши находится над "Группа 2", а текущий элемент дерева - "Группа 3". Пробовал добавить в styleSheet следующее: QTreeWidget::item:hover { background: rgba(125, 125, 0, 50); }
QTreeWidget::item:selected { background: rgba(125, 125, 0, 50); }
Но при выделении цвет из стайлшита заменяет собой цвет элемента и вдобавок цвет текста меняется на белый, хотя в стайлшите текст никак не меняется. Тестовый проект во вложении. Тестировал на Win7 и Qt 5.3.2
|
|
|
2
|
Qt / Базы данных / PostgreSQL и кодировка сообщений
|
: Июнь 08, 2016, 12:44
|
Добрый день! Помогите разобраться в след. вопросе. Есть виртуалка дебиан 8 с постгресом 9.4, энкодинг кластера утф-8, энкодинг базы тоже утф-8, lc_messages = 'ru_RU.UTF-8' При успешном подключении к базе из приложения текст и сообщения постгреса нормально читаются, проблем нет. Если попытаться подключиться с неправильными логин/пароль, то выдаётся ошибка "Р’РђР–РќРћ: пользователь \"test1\" РЅРµ прошёл проверку подлинности (РїРѕ паролю)\nQPSQL: Unable to connect" Собственно, вопрос: почему кракозябры, вместо читаемого сообщения на русском? Начал копать. В исходниках драйвера, в функции static QSqlError qMakeError(...): QString msg = p->isUtf8 ? QString::fromUtf8(s) : QString::fromLocal8Bit(s); p->isUtf8 инициализируется false и значение устанавливается только после подключения к серверу, вызовом запроса exec("SET CLIENT_ENCODING TO 'UNICODE'"). Т. е., приложение считает, что до успешного подключения все сообщения от сервера приходят в локальной кодировке, на windows это CP1251, отсюда и кракозябры. Помогла установка QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); Вроде всё работает, все сообщения на русском, текст из базы тоже нормально достаётся, но может есть какие-то подводные камни в таком способе? Как вариант ещё можно завести тикет, чтоб по умолчанию p->isUtf8 инициализировался в true, вряд ли кто-то в 21 веке будет создавать постгресовскую базу не в юникоде :-/
|
|
|
3
|
Qt / Общие вопросы / Re: Пространственная обработка (полигоны, линии, точки...)
|
: Август 11, 2015, 09:41
|
В Qt есть классы для работы с полигонами - QPolygon(F), простейшие пересечения они обрабатывают.
Для полноценной обработки пространственных данных можно использовать уже упоминавшийся GEOS либо подключить библиотеки QGIS, которые по сути тоже используют GEOS.
|
|
|
4
|
Компиляторы и платформы / Windows / Re: Использование библиотек, скомпилированных разными версиями MSVS
|
: Июль 06, 2015, 15:22
|
Неужели Вы ее дочитали до конца? Вы не поверите - дочитал. И даже кое-что для себя уяснил не на уровне "все говорят, что это плохо, значит это плохо", а почему именно плохо и чем оно грозит. ...а новая студия очень редко может импортировать проект старой студии Переходил с шестой на 2008 а потом на 2012 - пока ни разу не столкнулся с "отказом импорта" Проекты разные бывают, зависимости тоже. Сейчас уже не скажу, с чем именно возникали проблемы импорта, но на вскидку последние версии libiconv визуал студией не собрать без танцев с бубном. Это, конечно, не проблема визуал студии, и не проблема libiconv, да и вообще к теме не относится.
|
|
|
6
|
Компиляторы и платформы / Windows / Использование библиотек, скомпилированных разными версиями MSVS
|
: Июль 05, 2015, 14:52
|
Здравствуйте! Вопрос наверно банальный, но всё же В проекте использую пачку библиотек, скомпилированных в MSVS 2010, сам проект пока тоже компилирую 2010 студией, но хочется уже перейти на более новую студию. Попробовал скомпилировать проект 2013 студией, вроде всё нормально работает, но закрались сомнения в правильности такого подхода, отсюда и вопрос: Можно ли брать библиотеки, скомпилированные 2010 студией и использовать их в проекте 2013 студии? Не будет ли каких-то проблем из-за разных рантаймов?
|
|
|
7
|
Qt / Установка, сборка, отладка, тестирование / QPSQL, debug версия
|
: Ноябрь 28, 2011, 10:02
|
Здравствуйте! Штатный драйвер QPSQL, поставляемый с qt-win-opensource-4.7.4-vs2008, не работает в debug режиме. При загрузке драйвера выдаётся: "Cannot load library C:/Qt/4.7.4/plugins/sqldrivers/qsqlpsqld4.dll: Не удалось запустить приложение, поскольку его параллельная конфигурация неправильна. Дополнительные сведения содержатся в журнале событий приложений или используйте программу командной строки sxstrace.exe для получения дополнительных сведений." В журнале событий видим следующее: Ошибка при создании контекста активации для "C:\Qt\4.7.4\plugins\sqldrivers\qsqlpsqld4.dll". Не найдена зависимая сборка "Microsoft.VC80.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50608.0"". Используйте sxstrace.exe для подробной диагностики. Ну и в сам плагин встроен следующий манифест: <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel> </requestedPrivileges> </security> </trustInfo> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> </dependentAssembly> </dependency> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> </dependentAssembly> </dependency> </assembly>
Пересобрал плагин, зависимость от Microsoft.VC80.DebugCRT исчезла, в debug режиме всё работает. Является ли это багом Qt? И если является, может кто-нибудь запостит баг репорт?
|
|
|
8
|
Qt / Многопоточное программирование, процессы / Re: Удаление объекта в потоке
|
: Май 12, 2011, 13:53
|
Работать наверное будет но мне лично не нравится А вдруг toggled вызовется 2 раза подряд с true? Хм, об этом не подумал, но ет можно переделать. И зачем задействовать closeEvent которое напрямую с ниткой не связано?
если вызвать "on_actConnectToServer_toggled(false);" в деструкторе, то сигнал finished() не испускается и объект не удаляется. Это, конечно, лечится с помощью qApp->processEvents(), но как-то ет не очень) а можно и по-простому сделать mpS членом класса нитки (создавать в конструкторе, удалять в деструкторе).
В данном случае придётся наследоваться от QThread, от чего я и хотел отказаться) Наверно будет лучше создать объект 1 раз при запуске потока и удалять при сигнале destroyed() + слот для управления работой самого объекта
|
|
|
9
|
Qt / Многопоточное программирование, процессы / Re: Удаление объекта в потоке
|
: Май 12, 2011, 12:06
|
Когда нитка испустит finished, с ее eventLoop уже покончено, поэтому до deleteLater дело не дойдет (если объект был перенесен с помощью moveToThread). Можно сделать слот где объект будет удаляться и связать его с тем же finished. Хорошо бы смотрелось и создание объекта по сигналу started
Эти требует чуть больше строк, зато просто и надежно
Сделал следующим образом: class CMainWindow : public QMainWindow { Q_OBJECT ....... private: QThread mThread; CSomeClass *mpS; ....... };
CMainWindow::CMainWindow(QWidget *parent) : QMainWindow(parent), mpUi(new Ui::CMainWindow) { ....... connect(&mThread, SIGNAL(finished()), this, SLOT(deleteListener())); ....... }
void CMainWindow::closeEvent(QCloseEvent * e) { on_actConnectToServer_toggled(false); e->accept(); }
void CMainWindow::on_actConnectToServer_toggled( bool v ) { if(v) { mpS = new CSomeClass; mpS->moveToThread(&mThread);
mThread.start();
} else { mThread.quit(); mThread.wait(); } }
void CMainWindow::deleteListener() { delete mpS; }
Вроде работает, но правильно ли удалять объект, находящийся в другом потоке, пусть и уже остановленном?
|
|
|
10
|
Qt / Многопоточное программирование, процессы / Re: Удаление объекта в потоке
|
: Май 12, 2011, 11:00
|
удаление по deleteLater() вроде происходит в eventLoop потока, которому он принадлежит. Может дело в том, что eventLoop потока уже не работает, поэтому объект и не удаляется?
Да, в документации по Qt::QueuedConnection так и написано, в этом-то и проблема. Объект в поток засунули, а как его удалить после этого?
|
|
|
11
|
Qt / Многопоточное программирование, процессы / Удаление объекта в потоке
|
: Май 12, 2011, 10:54
|
Здравстуйте! После прочтения данных постов ( http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ и http://labs.qt.nokia.com/2006/12/04/threading-without-the-headache/) решил переделать логику работы с потоком, но столкнулся с проблемой удаления объекта, помещаемого в поток. Имеется: class CMainWindow : public QMainWindow { Q_OBJECT ....... private: QThread mThread; ....... };
CMainWindow::CMainWindow(QWidget *parent) : QMainWindow(parent), mpUi(new Ui::CMainWindow) { ....... mThread.start();
CSomeClass *s = new CSomeClass; connect(&mThread, SIGNAL(finished()), s, SLOT(deleteLater()));
s->moveToThread(&mThread); ....... }
CMainWindow::~CMainWindow() { mThread.quit(); mThread.wait(); }
По логике, объект CSomeClass должен удаляться при завершении потока, но деструктор не вызывается. Подозреваю, что это всё из-за механизма QueuedConnection. Как быть в такой ситуации?
|
|
|
12
|
Qt / Model-View (MV) / Re: Замена таблицы на модель/представление
|
: Декабрь 18, 2010, 13:57
|
А как в таком случае связать изменение свойств объектов с моделью? Как оно сейчас сделано: приходит пакет с данными, с определённым id, по этому id получаем нужный объект и передаём ему пакет. Если какие-то свойства изменились - обновляем соответствующую строку в таблице.
|
|
|
13
|
Qt / Model-View (MV) / Замена таблицы на модель/представление
|
: Декабрь 18, 2010, 13:29
|
Здравствуйте! Прочитал в ассистанте про MVC, вроде то, что надо, но не до конца понял, каким образом всё организовать. Имеется класс-контейнер, содержащий список объектов и управляющий сохранением/загрузкой/добавлением этих объектов в базу (по сути QMap< QString, CSomeClass*>). Свойства объектов отображаются в QTableWidget, при их изменении необходимо обновлять таблицу. Насколько я понял, MVC для этого и предназначен. Пока что мне непонятно, как описать модель: она будет работать с контейнером объектов или должна его заменить?
|
|
|
15
|
Qt / Установка, сборка, отладка, тестирование / Re: VC90.CRT зависимость
|
: Сентябрь 07, 2010, 09:40
|
Здравствуйте, люди добрые! Прошу прощения за поднятие старой темы. Возникла необходимость в сборке проекта в VS2008 и появилось несколько вопросов с манифестами и зависимостями. 1. Стоит VS2008 Express SP1. Создаю обычное win32 приложение. Студия создаёт следующий манифест: <?xml version='1.0' encoding='UTF-8' standalone='yes'?> <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level='asInvoker' uiAccess='false' /> </requestedPrivileges> </security> </trustInfo> <dependency> <dependentAssembly> <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> </dependentAssembly> </dependency> </assembly> Хотя в <Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC90.CRT версия 30729.1 Dependency Walker при профайле загружает "c:\windows\winsxs\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_x-ww_d495ac4e\MSVCR90.DLL" Скопировал <Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC90.CRT в папку с этим приложением и попробовал запустить на чистой системе. Получил ошибку - приложение неправильно сконфигурировано. Почему манифест создаётся с более старой версией библиотек, а не с версией VS2008? 2. Создаю простое Qt приложение. При компиляции создаётся такой манифест: <?xml version='1.0' encoding='UTF-8' standalone='yes'?> <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level='asInvoker' uiAccess='false' /> </requestedPrivileges> </security> </trustInfo> <dependency> <dependentAssembly> <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*' /> </dependentAssembly> </dependency> <dependency> <dependentAssembly> <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> </dependentAssembly> </dependency> </assembly> На чистой системе также появляется ошибка о неправильном конфигурировании, хотя папка <Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC90.CRT присутствует в папке с бинарником. Нужно ли в данном случае в файле Microsoft.VC90.CRT.manifest прописать ещё и COMCTL32.DLL? Знаю, что рекомендуется ставить C++ redist, но хотелось бы разобраться с этим способом.
|
|
|
|
|