Для Qt 4.8.5 или Qt 4.8.6.
Ох и наелся я с печатью длинных таблиц. Багов в 4.8 просто мильён.
Итак, есть длинная таблица в html. Мы подаем ее в QTextDocument через setHtml(). Затем печатаем
doc->print(printer);
1) Чтобы таблица повторяла на каждой странице заголовок нужно этот заголовок выделить тегом <thead>.
2) Это не должна быть вложенная таблица.
3) Забудьте про задний фон, не используйте bgcolor или background-color. Т.к. это чудо вполне может закрасить этим цветом шапку таблицы.
4) Не используйте valign=middle.
После этого таблица будет более менее корректно отображаться. Резать оно будет конечно от балды и возможно прям поперек слова. Но это лучше чем ничего.
четверг, 24 октября 2019 г.
вторник, 23 апреля 2019 г.
QTreeView items spacing
Как сделать отступ между элементами QTreeView?
Первый и простой способ - заюзать styleSheet.
my_tree_->setStyleSheet(".QTreeView::item{ margin: 0px 6px 6px 6px; border: 0;}");
Второй тру способ заюзать делегата.
my_tree_->setItemDelegate(new MyItemDelegate(this));
MyItemDelegate::MyItemDelegate(QObject * parent)
: QItemDelegate(parent)
{
}
QSize MyItemDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const
{
QSize sz = QItemDelegate::sizeHint(option, index);
sz.setHeight(sz.height() + 10);//накидываем 10 пикселей по 5 сверху и снизу
return sz;
}
void MyItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QStyleOptionViewItemV3 opt = option;
opt.rect.adjust(0, 0, -5, -5);//немножко уменьшаем размер item для отрисовки
QItemDelegate::paint(painter, opt, index);//рисуем
}
Вот таким нехитрым способом можно сделать отступы между элементами, мать их, убил на это полдня.
У QListView есть setSpacing, которого нет у QTreeView.
Первый и простой способ - заюзать styleSheet.
my_tree_->setStyleSheet(".QTreeView::item{ margin: 0px 6px 6px 6px; border: 0;}");
Второй тру способ заюзать делегата.
my_tree_->setItemDelegate(new MyItemDelegate(this));
MyItemDelegate::MyItemDelegate(QObject * parent)
: QItemDelegate(parent)
{
}
QSize MyItemDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const
{
QSize sz = QItemDelegate::sizeHint(option, index);
sz.setHeight(sz.height() + 10);//накидываем 10 пикселей по 5 сверху и снизу
return sz;
}
void MyItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QStyleOptionViewItemV3 opt = option;
opt.rect.adjust(0, 0, -5, -5);//немножко уменьшаем размер item для отрисовки
QItemDelegate::paint(painter, opt, index);//рисуем
}
Вот таким нехитрым способом можно сделать отступы между элементами, мать их, убил на это полдня.
У QListView есть setSpacing, которого нет у QTreeView.
вторник, 2 апреля 2019 г.
OpenSSL https
Как добавить поддержку OpenSSL в собранную Qt.
1) Ставим OpenSSL в D:\OpenSSL.
2) configure -debug-and-release -mp -qt-zlib -qt-libjpeg -qt-libpng -opensource -platform win32-msvc2008 -openssl -I D:\OpenSSL\include -L D:\OpenSSL\lib
3) cd %QTDIR%:\src\network
4) qmake
5) nmake
В проекте:
QMAKE_LIBDIR += d:/OpenSSL/lib
LIBS += libeay32.lib ssleay32.lib crypt32.lib
INCLUDEPATH += D:/OpenSSL/include
Проверяем
#include <QSslConfiguration>
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
Должно собраться.
HTTPS запрос.
QNetworkRequest request;
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::TlsV1);
request.setSslConfiguration(config);
request.setUrl(url);
1) Ставим OpenSSL в D:\OpenSSL.
2) configure -debug-and-release -mp -qt-zlib -qt-libjpeg -qt-libpng -opensource -platform win32-msvc2008 -openssl -I D:\OpenSSL\include -L D:\OpenSSL\lib
3) cd %QTDIR%:\src\network
4) qmake
5) nmake
В проекте:
QMAKE_LIBDIR += d:/OpenSSL/lib
LIBS += libeay32.lib ssleay32.lib crypt32.lib
INCLUDEPATH += D:/OpenSSL/include
Проверяем
#include <QSslConfiguration>
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
Должно собраться.
HTTPS запрос.
QNetworkRequest request;
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::TlsV1);
request.setSslConfiguration(config);
request.setUrl(url);
QNetworkReply *netReply = netManager.get(request);
Postgres SQL
Поддержка Postgres SQL.
1) Скачиваем бинари постгреса отсюда https://www.postgresql.org/download/
2) Копируем бинари на НЖМД например сюда D:\pgsql
3) Добавляем в PATH путь D:\pgsql\bin
4) Собираем плагин в Qt
qsqlpsqld4.dll
pro файл править не надо. Используем в проекте
1) Скачиваем бинари постгреса отсюда https://www.postgresql.org/download/
2) Копируем бинари на НЖМД например сюда D:\pgsql
3) Добавляем в PATH путь D:\pgsql\bin
4) Собираем плагин в Qt
- Конфигурируем исходники и включаем нужный драйвер как plugin
configure.exe -I D:/pgsql/include -L D:/pgsql/lib -plugin-sql-psql
cd src\plugins\sqldrivers\psql
qmake
nmake
qsqlpsqld4.dll
pro файл править не надо. Используем в проекте
db_ = QSqlDatabase::addDatabase("QPSQL");
db_.setHostName("host");
db_.setPort(5432);
db_.setDatabaseName("bisys");
db_.setUserName("postgres");
db_.setPassword("postgres");
db_.open();
воскресенье, 10 февраля 2019 г.
MS Visual Studio и mocinclude.tmp
Если в вашем проекте больше 40 путей include, которые описаны в INCLUDEPATH, то Qt создает временный файл mocinclude.tmp, в который включает все описанные пути.
Проблема в том, что студия не совсем корректно обрабатывает этот файл. Выражается это в том, что при каждой сборке студия начинает полностью пересобирать проект вместо того, чтобы пересобрать только измененные файлы.
Чтобы не допустить создания mocinclude.tmp надо изменить в Qt файл
d:\qt\mkspecs\features\moc.prf
изменив строчку
win32:count($$list($$INCLUDEPATH), 40, >) {
Проблема в том, что студия не совсем корректно обрабатывает этот файл. Выражается это в том, что при каждой сборке студия начинает полностью пересобирать проект вместо того, чтобы пересобрать только измененные файлы.
Чтобы не допустить создания mocinclude.tmp надо изменить в Qt файл
d:\qt\mkspecs\features\moc.prf
изменив строчку
win32:count($$list($$INCLUDEPATH), 40, >) {
на
win32:count($$list($$INCLUDEPATH), 100, >) {
Таким образом мы просто увеличили количество путей с 40 до 100.
среда, 6 февраля 2019 г.
Qt Installer: удаление по маске
Qt Installer не умеет удалять файлы по маске.
Нельзя просто так взять и написать
Для Windows
Для Linux
Нельзя просто так взять и написать
component.addOperation("Execute", "rm", "-f", "files*");Это не сработает. Это обходится вызовом командного интерпретатора
Для Windows
component.addOperation("Execute", "cmd.exe", "/C", "del", "files*.*");
Для Linux
component.addOperation("Execute", "bash", "-c", "rm -f files*");Последний параметр для Linux надо писать целиком, не разделяя на части. В этом случае Qt Installer при вызове обернет команду кавычками и результат будет как если бы вы вызвали команду
bash -c "rm -f files*"
вторник, 5 февраля 2019 г.
Qt Installer: replace
Qt Installer использует скриптовый язык ECMAScript (http://doc.qt.io/qt-5/ecmascript.html)
По структуре он схож с JavaScript, но полностью они не пересекаются.
Но решения можно искать и по JavaScript.
Например, функция replace меняет только первое вхождение в строку.
var str = "bla-bla-bla";
str.replace("bla", "vobla");
Получим vobla-bla-bla.
Чтобы заменить все вхождения, надо использовать регулярку.
По структуре он схож с JavaScript, но полностью они не пересекаются.
Но решения можно искать и по JavaScript.
Например, функция replace меняет только первое вхождение в строку.
var str = "bla-bla-bla";
str.replace("bla", "vobla");
Получим vobla-bla-bla.
Чтобы заменить все вхождения, надо использовать регулярку.
str.replace(/bla/g, "vobla");
Подписаться на:
Сообщения (Atom)