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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [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, да и вообще к теме не относится.
5  Компиляторы и платформы / Windows / Re: Использование библиотек, скомпилированных разными версиями MSVS : Июль 06, 2015, 12:25
Нашёл вот такую статейку, в которой всё более-менее расписано: http://siomsystems.com/mixing-visual-studio-versions/

Практически проблемы гарантированы, поэтому чем раньше все будет на новом компиляторе - тем лучше. Пока можно использовать "toolchain" - эта опция позволяет компилить код как для предыдущих MSVC версий.
Проблемы как раз с перекомпиляцией - не все гнутые библиотеки предоставляют простой способ скомпилировать себя в новой студии, а новая студия очень редко может импортировать проект старой студии  Грустный
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 для этого и предназначен.
Пока что мне непонятно, как описать модель: она будет работать с контейнером объектов или должна его заменить?
14  Qt / Установка, сборка, отладка, тестирование / Re: VC90.CRT зависимость : Сентябрь 07, 2010, 14:57
Порывшись в интернетах, выяснил, что для сборки с текущей версией рантайм библиотек в VS2008SP1 необходимо задать директиву
#define _BIND_TO_CURRENT_VCLIBS_VERSION 1
в каждом проекте.
Вопрос с COMCTL32.DLL пока остаётся открытым
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, но хотелось бы разобраться с этим способом.
Страниц: [1] 2

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