© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
25 сентября 2018 г. 8:51
avovana

Автозапуск и авторестарт Qt Gui Application в Linux

Здравствуйте, дорогие форумчане! Сделал специальную тему для такого вопрос.


У меня Debian 9.5.

Моё приложение не получилось запустить с помощью утилиты systemd.

Писал, что

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
qt.qpa.screen: QXcbConnection: Could not connect to display 
Could not connect to any X display


По мере изучения вопроса я понял, что systemd может стартовать и рестортовать в случае падения программы без GUI.

Посмотрел в сторону обычной автозагрузке - Desktop Entry Files. Статья есть на этом сайте.

Автозагрузка прошла успешно. Но мне нужен еще и рестарт программы при её закрытие, крушение.


Посмотрел в сторону supervisor . Думал, что она меня спасет. Но нет. После переделывания тестового примера и попытки запуска получил тоже:

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
qt.qpa.screen: QXcbConnection: Could not connect to display 
Could not connect to any X display.


Вот мой скрипт:


Файл: /usr/local/bin/long.sh                       

#!/bin/bash
/opt/control_block/b/bin/control_block

Вот кофиг:

Файл: /etc/supervisor/conf.d/long_script.conf

[program:long_script]
command=/usr/local/bin/long.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/long.err.log
stdout_logfile=/var/log/long.out.log

Не могли бы помочь, почему не хочет подключиться к X-Server?

Вручную запустить могу. Переменная DISPLAY установлена.


Здесь говорится о такой проблеме. Приводится код для устранения. Но и упоминается, что это:

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
qt.qpa.screen: QXcbConnection: Could not connect to display

всего-лишь warning.

9 августа 2018 г. 8:29

LinuxBash скрипт для создания и скачивания дампа базы данных и медиа файлов с удаленного сервера

Bash, rsync, Linux

В процессе разработки сайта на Django пришлось начать разбираться с Bash скриптами, чтобы автоматизировать рутинные задачи. Например, создание и скачивание дампа базы данных с сайта, а также резервирования медиа файлов.

Будем считать, что что Вы уже имеет доступ к серверу через ssh , а у вашего пользователя на сервере, который управляет сайтом есть права доступа, с помощью которых он может делать дамп базы данных.

7 августа 2018 г. 7:10

LinuxПодсчёт количества коммитов по авторам в Git

Git, Fun, Linux

Just for fun.

Чем могут меряться программисты? Конечно, своими коммитами, хотя бы их количеством в Git репозитории.

Для этого можно использовать команду git shortlog, которая суммирует вывод git log, предоставляя более краткий вывод.

Опции

У данной команды есть несколько опций, но используем только две из них

-n
--numbered

Сортировка вывода в соответствии с количеством коммитов на автора

-s
--summary

Подавить описание коммита и предоставить только сводный счетчик.

9 января 2018 г. 9:45
Ruslan Polupan

Исключения. Потоки.

Делаю небольшую утилиту по работе с базой Fierbird.

Под MinGW на win компилировалось без проблем.
На работе попробовал собрать про Linux выдало следующее:
Warning: Qt has caught an exception thrown from an event handler. Throwing
exceptions from an event handler is not supported in Qt.
You must not let any exception whatsoever propagate through Qt code.
If that is not possible, in Qt 5 you must at least reimplement
QCoreApplication::notify() and catch all exceptions there.

Подозреваю что что-то с потоками. Ибо только начал с ними разбираться. В потоке создаю подключение к базе данных для дальнейшего использования.

Класс подключения который передаю в поток.

dbaseconnect.h

#ifndef DBASECONNECT_H
#define DBASECONNECT_H

#include <QObject>
#include <QMap>

class DBaseConnect : public QObject
{
    Q_OBJECT
public:
    explicit DBaseConnect(QMap<QString,QString> opt, QObject *parent = nullptr);
signals:
    void connectionError(QString errorMeaage);
    void fin();
    void sendStatus(bool);
public slots:
    void createConnection();
private:
    QMap<QString, QString> config;
};

#endif // DBASECONNECT_H
dbaseconnect.cpp
#include "dbaseconnect.h"
#include <QtSql>
#include <QDebug>

DBaseConnect::DBaseConnect(QMap<QString,QString> opt, QObject *parent) : QObject(parent)
{
    config = opt;
}

void DBaseConnect::createConnection()
{

    ///Подключаемся к базе данных АЗС
    QSqlDatabase db = QSqlDatabase::addDatabase("QIBASE","central");
    db.setHostName(config.value("server"));
    db.setDatabaseName(config.value("basename"));
    db.setUserName(config.value("login"));
    db.setPassword(config.value("password"));
    if(!db.open()) {
        emit sendStatus(false);
        QString errorString =  db.lastError().text();
        qDebug() <<  "Не возможно подключиться к базе данных." << endl << "Причина:" << errorString;

        emit connectionError(errorString);
        emit fin();
    }
    emit sendStatus(true);
    emit fin();
}

Подключение по кнопке в диалоге со писком подключений.
void ConnectionDialog::on_pushButtonConnect_clicked()
{
    thread = new QThread;
    progress = new QProgressDialog();
    isConnected =true;
    progress->setWindowModality(Qt::WindowModal);
    progress->setLabelText("Подключение к центральной базе данных...");
    progress->setCancelButton(0);
    progress->setRange(0,0);
    progress->setMinimumDuration(0);

    database.insert("server", ui->lineEditServer->text().trimmed());
    database.insert("basename",ui->lineEditDataBase->text().trimmed());
    database.insert("login",ui->lineEditLogin->text().trimmed());
    database.insert("password",ui->lineEditPassword->text().trimmed());

    DBaseConnect *dbConn = new DBaseConnect(database);

    connect(thread,SIGNAL(started()),this,SLOT(startDBConnect()));
    connect(thread,SIGNAL(started()),dbConn,SLOT(createConnection()));
    connect(thread,SIGNAL(finished()),this,SLOT(finishDBConnect()));
    connect(dbConn,SIGNAL(sendStatus(bool)),this,SLOT(getStaus(bool)));
    connect(dbConn,SIGNAL(connectionError(QString)),this,SLOT(errogConnectInfo(QString)));
    connect(dbConn,SIGNAL(fin()),thread,SLOT(terminate()));


    thread->start();
    dbConn->moveToThread(thread);
}
Слоты
void ConnectionDialog::startDBConnect()
{
    progress->show();
}

void ConnectionDialog::finishDBConnect()
{
    progress->cancel();
    if(isConnected) {
        this->accept();
    }
}

void ConnectionDialog::errogConnectInfo(QString str)
{
    QMessageBox::critical(0, qApp->tr("Не могу открыть базу данных"),
                              QString("Не могу установить соединение с центральной БД!\nПричина: %1\n Проверьте настройки подключения.").arg(str),
                              QMessageBox::Ok);
    isConnected=false;
}

void ConnectionDialog::getStaus(bool status)
{
    isConnected =status;
}

Подскажите что я делаю не так.

ЗЫ: Программирование это для меня небольшое хобби. Так что буду рад любым комментариям.
16 января 2017 г. 19:08
Arrow

Определение размера папки в кБ в Linux

Доброго времени суток!

Подскажите, пожалуйста, как можно корректно в Linux перевести размер папки с байт в килобайты.

Проблема вот в чем:

1. Вычисляю суммарный размер папки с вложенными в нее папками в байтах.

2. Перевожу с байт в кБ, МБ, ГБ и т.д. простым делением в цикле размера в байтах на 1024. (Пропускаю "ссылку" на текущий и родительский каталог - " . " и " .. ").

3. Вывожу результат и перепроверяю его в Nautilus через свойства папки и получаю несовпадение (мое значение меньше).

В Windows все корректно работает.

Вычислил, что если суммарный размер папки в байтах делить не на 1024, а на приблизительно 1006, то все верно выходит (с небольшой погрешностью в несколько байт).

Не могу понять где проблема.

P.S. Размер пустой папки в Linux - 8,0 КБ.

15 января 2017 г. 11:25
kost_3

Получение прав root из запущеной программы Qt

Есть приложение, написаное на qt, которому могут понадобиться root права при выполнение некоторых действий. Так вот, как это организовать?
P.S Нужно примерно как на картинке (при нажатии на кнопку "Разблокировать" открывается окно для ввода пароля)

14 сентября 2016 г. 17:18

LinuxПервоначальная настройка доступа к VDS на Ubuntu 16.04

Linux, VDS, Ubuntu

В связи с развитием ресурса EVILEG, было принято решение по плавному переезду на домен COM, а также переводу сайта с CMS Wordpress на фреймворк Django. С Ruby On Rails как-то не заладилось, а вот с Django процесс пошёл практически сразу.

Выбирать другой хостинг я не стал, и остался с текущим хостингом TIMEWEB , кстати рекомендую тем, кто ещё не определился со своим будущим хостингом VDS.

А теперь приступим к первоначальной настройке доступа к VDS, который предоставляет TIMEWEB.

25 августа 2016 г. 17:00

LinuxТоп 10 Разработчиков и Компаний, внёсших вклад в ядро Linux в 2015-2016 годах

Linux, 25 лет, Linux Kernel

Сообщество ядра Linux закрыло год установлением нового рекорда по числу изменений влитых в один релиз, по сравнению с предыдущим отчётом разработки Linux Kernel .

В версии ядра 4.6 можно увидеть около 13,517 патчей влитых за 63 дня, что равно рекорду, установленному версией 3,15 в объёме 13,722 патчей 8 июня 2014.

Но изменения в ядро вносятся сломя голову последние 15 месяцев, с количеством в более чем 3 миллиона строк, добавленных в ядро Linux со скоростью 7,8 изменений в час.

"Способность поддерживать данную скорость изменений в течение многих лет является беспрецедентной для какого-либо общественного проекта программного обеспечения" - согласно отчёту.

Седьмое издание этого отчёта детализирует информацию по разработчикам, внёсшим вклад в ядро, и компаниям, в которых они работают, и наиболее важные изменения сделанные в коде в процессе разработки ядра с версии 3.18. Данные охватывают в основном разработку с последнего отчёта в Марте 2015 -- версии с 3.19 по 4.7 -- но некоторая статистика охватывает и 2005 год, когда разработка была перемещена в Git репозиторий, и даже охватывает первый выпуск Линуса Торвальдса в 1991 году.

15 февраля 2016 г. 15:07

QtQt Linux - Урок 001. Автозапуск Qt приложения под Linux

Qt, Linux, Ubuntu, autorun, автозапуск

Поговорим, о том, как добавить в Qt приложение функционал по настройке автозапуска данного приложения. Например, у нас имеется окно настроек и мы хотим сделать возможность настройки автозапуска приложения из этого диалогового окна.

В отличие от автозапуска в Windows , где можно воспользоваться QSettings и внести изменения в реестр, в Linux потребуется создать специальный исполняемый файл, который будет отвечать за автозапуск приложения при входе пользователя в операционную систему.

Допустим название проекта и соответственно название исполняемого файла будет AutorunLinux, тогда потребуется создать исполняемый файл AutorunLinux.desktop по следующему пути:

~/.config/autostart/AutorunLinux.desktop

Содержимое исполняемого файла нужно сделать аналогичным другим файлам автозапуска других приложений, чтобы гарантировано получить требуемый результат. В случае с Ubuntu Linux 15.04/15.10 содержимое файла получилось следующее:

[Desktop Entry]
Type=Application
Exec=/home/dekadent/QT/Projects/build-AutorunLinux-Desktop_Qt_5_5_1_GCC_64bit-Debug/AutorunLinux
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_GB]=AutorunLinux
Name=AutorunLinux
Comment[en_GB]=AutorunLinux
Comment=AutorunLinux
15 октября 2018 г. 21:36
Allyans .

C++ - Тест 001. Первая программа и типы данных

  • Результат 60баллов,
  • Очки рейтинга-1
15 октября 2018 г. 11:25
Екатерина Самойлова

C++ - Тест 002. Константы

  • Результат 33баллов,
  • Очки рейтинга-10
15 октября 2018 г. 11:17
Екатерина Самойлова

C++ - Тест 006. Перечисления

  • Результат 80баллов,
  • Очки рейтинга4
Последние комментарии
10 октября 2018 г. 9:50
Евгений Легоцкой

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

Если и начинать писать о плагинах, то нужно тогда с Qt Creator начинать, там наверняка будет одинаковый принцип, но по Qt Creator хотя бы информация есть.
10 октября 2018 г. 9:48
ost.vld

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

О плагинах к QtCreator в целом, тоже интересно.
10 октября 2018 г. 9:46
ost.vld

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

ну типа того, создание программы, функционал которой можно расширять плагинами, и, в перспективе, создание API.
10 октября 2018 г. 8:31
Евгений Легоцкой

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

Типо как в Qt Creator? Самому бы интересно было о таком почитать. В данный момент я бы мог написать только о написании плагинов для Qt Designer. С этим есть некоторый опыт.
Сейчас обсуждают на форуме
15 октября 2018 г. 12:45
Allyans .

QGraphicsItem change color

Хорошо)
11 октября 2018 г. 10:13
Arrow

Работа с WebView в QML

Нашел в чем проблема. Пишу на случай если кому-то попадется такое же счастье с WebView как и мне. Проблема как оказалась с Debug версией, так как в Release и Profile все работает (...
10 октября 2018 г. 12:49
Виталий Антипов

Кто что делает на Qt?

Работаем по локальной сети. Файл базы, схемы и фото лежат на сервере. Чтобы не было проблем при одновременной работе с одним файлом, все запросы обернул в транзакции, как указано в документаци...
10 октября 2018 г. 11:21
Arrow

Редактирование записи на форуме

Добрый день! К сожалению встретил небольшой баг на форуме. При создании записи на форуме и вставке кода, через соответствующую кнопку номера строк проставляются верно, но каждый...
10 октября 2018 г. 9:46
Arrow

Настройка Qt Creator для Android

Я Genymotion  ставил с VBox в комплекте для личного использования, после добавил из списка телефон с нужным API. Запустил его и при компиляции Qt Creator сам нашел его и все запустилось...
Присоединяйтесь к нам в социальных сетях