Последнее обновление:
May 24, 2021

Есть мысль... Жми, напиши!
Что имеем: Постов : 142 Авторов: 1 Категорий: 22

Заметки о Qt

Вывод всплывающих сообщений:
[cc lang=»C»] QMessageBox::information(0, «Message», «Привет, мир!»);
[/cc] Не забыть подключить:
[cc lang=»C»] #include
[/cc]

Вывод отладочного сообщения в консоль сборки:
[cc lang=»C»] qDebug()< <"Hello, world!"; [/cc] Не забыть подключить: [cc lang="C"] #include
[/cc]

Если проблемы с кириллицей
[cc lang=»C»] QTextCodec* codec = QTextCodec::codecForName(«UTF-8»);
QTextCodec::setCodecForTr(codec);
QMessageBox::information(0, «Message», tr(«Привет, мир!»));
[/cc] Не забыть подключить:
[cc lang=»C»] #include
[/cc]

QTextEdit
Получить текст строки в которой курсор:
[cc lang=»C»] QString str = editor->textCursor().block().text().trimmed(); //— текст строки, где курсор
[/cc] Получить глобальные координаты курсора
[cc lang=»C»] QRect rect = editor->cursorRect();
QPoint p1=editor->mapFromGlobal(editor->pos());
this->setGeometry(-p1.x()+rect.x()-100, -p1.y()+rect.y()+25, this->width(), this->height());
[/cc] Обработка нажатых клавиш:
Для этого потребуется создать дополнительный класс:
cleventfilter.h
[cc lang=»C»] #ifndef CLEVENTFILTER_H
#define CLEVENTFILTER_H
#include
#include
#include
#include
class clEventfilter : public QObject
{
Q_OBJECT
public:
explicit clEventfilter(QObject *parent = 0);
protected:
bool eventFilter(QObject *obj, QEvent *event);
signals:
void doeventt(QKeyEvent *event);
public slots:

};
#endif // CLEVENTFILTER_H
[/cc] cleventfilter.cpp
[cc lang=»C»] #include «cleventfilter.h»
clEventfilter::clEventfilter(QObject *parent) :
QObject(parent)
{
}
bool clEventfilter::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress)
{
//Qt::Key_Return — большой Enter, на основном разделе клав
//Qt::Key_Enter — в разделе с num-keys
QKeyEvent *keyEvent = static_cast(event);
if(keyEvent->key()==Qt::Key_Return)
{
emit doeventt(keyEvent); //— генерируем событие
}
}
return QObject::eventFilter(obj, event);
}
[/cc]

Ну и собственно подключение:
[cc lang=»C»] clEventfilter * eventf = new clEventfilter(this);
connect(eventf, SIGNAL(doeventt(QKeyEvent *)), this, SLOT(clEventFilterEVENT(QKeyEvent *)));
editor->installEventFilter(eventf);
[/cc]

Получить выделенное слово
[cc lang=»C»] QTextCursor cursor = editor->textCursor();
cursor.movePosition(QTextCursor::StartOfWord);
cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
QString str = cursor.selectedText();
[/cc] Удалить выделенное слово:
[cc lang=»C»] cursor.removeSelectedText();
[/cc] Вставить текст:
[cc lang=»C»] cursor.insertText(tt);
[/cc]

QShortCut
[cc lang=»C»]scDown = new QShortcut(QKeySequence(«Alt+Down»), editor); //— создяём горячую клавишу
connect(scDown, SIGNAL(activated()), this, SLOT(sgnKeyDown())); //— подключаем событие нажатия к обработчику
[/cc] Для кириллической раскладки:
[cc lang=»C»]QKeySequence( QString( «Ctrl+Alt+%1» ).arg( QTextCodec::codecForLocale()->toUnicode(«ы» )))[/cc]

Соединение с БД mysql
[cc lang=»C»] db = QSqlDatabase::addDatabase(«QMYSQL», «mydb»);
db.setHostName(«localhost»);
db.setDatabaseName(«WORKYS»);
db.setUserName(«root»);
db.setPassword(«12345»);
bool ok = db.open();
qDebug()<
[/cc]

QSqlQueryModel выборка с параметрами
[cc lang=»C»] QSqlQueryModel *model =new QSqlQueryModel(this); //— создаём модель
QSqlQuery query(db); //— создаём сам запрос к базе
query.prepare(«SELECT * FROM storage WHERE st_title REGEXP (:match)»);
model->setQuery(query);
widget->setModel(model);
[/cc] Не забыть подключить:
[cc lang=»C»] #include
#include
[/cc] Для обновленияя всех записей:
[cc lang=»C»] model->setQuery(model->query());
model->query().bindValue(«:match», match);
model->query().exec();
[/cc]

Получить значение из базы, выбранное в QTableView
[cc lang=»C»] QModelIndex current = ui->tableView->currentIndex();
qDebug()< tableView->model()->data(ui->tableView->model()->index(current.row(),1),0); //— получить значение первого поля
qDebug()< < ui->tableView->model()->data(ui->tableView->model()->index(current.row(),0),0); //—получить значение нулевого поля (обычно ид записи)
[/cc]

Скрыть столбец в QTableView
[cc lang=»C»] ui->tableView->setColumnHidden(0, true);
[/cc]

Кирилица MySql windows

[cc lang=»C»] QTextCodec::setCodecForCStrings(QTextCodec::codecForName(«UTF-8″));
[/cc]

Работа с регулярными выражениями:
Например получить все слова в QTextEditor
[cc lang=»C»] QRegExp rx(tr(«([а-яА-ЯA-Za-z0-9]+)»));
QString str = editor->textCursor().block().text().trimmed(); //— текст строки, где курсор
QString match;
int pos = 0;

while ((pos = rx.indexIn(str, pos)) != -1) { //— пройдёмся по всему найденному и выведем в консоль отладки
qDebug()<

Views :

2108

Ubuntu Qt 5.6 mysql 5.6 драйвер не найден, но доступен (driver not loaded)

Собственно ошибка: SqlDatabase: QMYSQL driver not loaded

Обновил пост для Qt 5.14 и MySQL 8.0

Для Qt 5 и выше обычно mysql драйвер уже идёт в стандартной поставке.
Для уточнения переходим в каталог установки Qt а далее в папку с драйверами, у меня это /opt/Qt/Qt5.14.0/5.14.0/gcc_64/plugins/sqldrivers
по идее там должен быть libqsqlmysql.so

Если он там есть,  может быть, что не найдена какая-либо зависимость для libqsqlmysql.so
проверять так:

ldd libqsqlmysql.so

скорее всего будет не найдена (not found) зависимость libmysqlclient_r.so.21

Можно, конечно, только его и поставить, вот так:
[32]

[64]

Проверяем:

ldd libqsqlmysql.so
Может быть так же не доступны быть:
libssl.so.10 и libcrypto.so.10
Ставить их так:
sudo apt-get update
sudo apt-get install libssl1.0.0 libssl-dev
cd /lib/x86_64-linux-gnu
sudo ln -s libssl.so.1.0.0 libssl.so.10
sudo ln -s libcrypto.so.1.0.0 libcrypto.so.10

Впринципе, можно на этом остановиться,
но я решил использовать более новый, поэтому придётся пересобрать.

У меня стоит MySQL версии 8.0 (узнать можно в терминале командой mysql —version)
поэтому потребуется драйвер собрать из исходников.
Запускаем консольку, вбиваем:

export QTDIR=/opt/Qt/Qt5.14.0/5.14.0/Src/qtbase
cd $QTDIR/src/plugins/sqldrivers
/opt/Qt/Qt5.14.0/5.14.0/gcc_64/bin/qmake   -- MYSQL_INCDIR=/usr/include/mysql   MYSQL_LIBDIR=/usr/lib/mysql
make sub-mysql
make install

Важно: что бы было можно пересобрать из исходников, он должны быть установлены! Если при установке Qt не отметили, то доустановить можно через MaintenanceTool, который в корне папки с Qt. Устанавливаете именно той версии, которая используется в комплекте QtCreator`а

Кстати, заголовочные файлы клиента mysql так же должны быть установлены!
Как это делать в вашем дистрибутиве должно легко гуглиться.

Установка MySQL 8.0 На Ubuntu 18.04:

wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.11-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.11-1_all.deb  #Выбираем 8 версию
sudo apt-get update
sudo apt-get install mysql-server mysql-client mysql-connector-odbc libmysqlclient-dev
Если при update будет ругаться, что ключ истёк, то обновить:
sudo apt-key adv —keyserver keys.gnupg.net —recv-keys 8C718D3B5072E1F5

Впринципе всё. Не забудьте пути заменить на свои. Qt у меня установлен в папке /opt/Qt/Qt5.14.0/.

Немного как подключится к базе MySQL из Qt
В проекте в файл *.pro   дабавить

QT+= sql

Ну а  потом в  классе прописать

#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>

Ну и подключаемся:

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "mydb");
db.setHostName("localhost");
db.setDatabaseName("WORKYS");
db.setUserName("root");
db.setPassword("12345");
bool ok = db.open();
qDebug()<< ((ok)? "DATABASE OPENED!!!!" : "DATABASE NOT OPENED" + db.lastError().text() );

Вот как то так =)

Views :

3924