Для 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.
После этого таблица будет более менее корректно отображаться. Резать оно будет конечно от балды и возможно прям поперек слова. Но это лучше чем ничего.
Qt Coding
Qt programming, Qt tools, source code, компоненты для Qt
четверг, 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");
четверг, 21 апреля 2016 г.
Снова по прокрутке большой БД
Возвращаюсь к теме просмотра большой БД в виде одной большой таблицы QTableView.
Ранее я писал про извращения с наследником QTableView, теперь будем делать это каноничнее.
Итак, есть большая БД, на 100 килострок минимум. Какая БД неважно, FireBird, SQLite и т.п.
Первое, что надо сделать это определить модель.
class QueryModel : public QAbstractTableModel
и определить в ней rowCount(). rowCount() определяется так:
"SELECT COUNT(ID) FROM TABLE"
Затем в классе определяем экземпляр QSqlQuery query_, которому говорим SELECT * FROM TABLE, условно.
Далее определяем data()
QVariant QueryModel::data(const QModelIndex & index, int role) const
{
if (role == Qt::DisplayRole)
{
if (query_->seek(index.row()))
{
const QSqlRecord & rec = query_->record();
Ранее я писал про извращения с наследником QTableView, теперь будем делать это каноничнее.
Итак, есть большая БД, на 100 килострок минимум. Какая БД неважно, FireBird, SQLite и т.п.
Первое, что надо сделать это определить модель.
class QueryModel : public QAbstractTableModel
и определить в ней rowCount(). rowCount() определяется так:
"SELECT COUNT(ID) FROM TABLE"
Затем в классе определяем экземпляр QSqlQuery query_, которому говорим SELECT * FROM TABLE, условно.
Далее определяем data()
QVariant QueryModel::data(const QModelIndex & index, int role) const
{
if (role == Qt::DisplayRole)
{
if (query_->seek(index.row()))
{
const QSqlRecord & rec = query_->record();
QVariant val = rec.value(index.column());
QString str = val.toString();
return str;
}
}
}
Всё. Этого достаточно чтобы иметь нормально прокручиваемую таблицу.
Небольшое дополнение, не нужно вызывать функции resizeColumnsToContents() и resizeRowsToContents(), это вызовет метод data() для всех строк и получите тормоза.
Подписаться на:
Сообщения (Atom)