Форум программистов, компьютерный форум CyberForum.ru

Qt

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 634, средняя оценка - 4.81
Чистый
Автор FAQ
2692 / 1388 / 71
Регистрация: 08.09.2011
Сообщений: 3,720
Записей в блоге: 1
#1

Вопрос - Ответ для новичков по Qt - C++ Qt

21.02.2012, 11:15. Просмотров 82185. Ответов 23

В данной теме буду выкладывать готовые решения на вопросы новичков.
Обсуждение, замечание, критика и т.п. вещи по данной теме тут:
Основные вопросы, вызывающие сложности у новичков (обсуждение)
 Комментарий модератора 
Если у вас есть пример, который вы хотите добавить в этот список, то пишите мне в личку!


Итак прежде чем писать какие-либо решения дам несколько, на мой взгляд, полезных советов:
  1. В не зависимости от того какой ОС вы пользуетесь, держите исходный текст в формате UTF-8. Этим вы исключите будущие проблемы с кириллицей непосредственно в тексте исходного кода. Для этого в QtCreator зайдите: Инструменты - Параметры - Текстовый редактор, выбирайте закладку "Поведение" и там укажите кодировку файлов как "UTF-8".
  2. Путь к исходным файлам ваших проектов, а так же путь куда установлена QtSDK, не должны содержат пробелов и кириллицы. Этот совет поможет избежать "магических" ошибок при компиляции, когда код верен, а компиляция не проходит.
  3. Используйте Теневую сборку для своих проектов (Смотрите в свойствах проекта). Теневая сборка - это когда сборка проекта идет в отдельном каталоге (пут к нему так же не должен содержать пробелов и кириллицы ), это позволяет держать в чистоте каталог исходных кодов и избавит в будущем от проблем, если вы надумаете несколько конфигурация для одних исходников
  4. Я тут посмотрел на советы выше, перечитал их и дам еще один совет, забудьте про кириллицу в программировании .
Данные советы будут пополнятся как только в моей голове возникнет еще какой-нибудь совет или его подскажет кто-то. Исполнять в точности эти советы нет необходимости, но прислушаться к ним новичкам, думаю стоит.....

Теперь непосредственно вопросы:
  1. Кириллица в ваших приложениях
  2. CheckListBox
  3. Перевод приложений на другие языки
  4. Система плагинов для вашего приложения
  5. Система плагинов вариант 2
  6. Работаем с ресурсами
  7. Регулярные выражения и строки [черновик]
  8. Отображение программы с различной формой
  9. Функция определения операционной системы
  10. Qml - перемещение формы мышкой
  11. Qml - графические эффекты (эффекты изменения обьектов)
  12. Qml - создаем внешний элемент
  13. Qml - доступ к внешним элементам
  14. Модули Qt
  15. Работа с zip архивами в Qt (разархивация)
  16. QLabel. Размер текста относительно ширины QLabel.
  17. Qml. Обьединение Qml и виджетов Qt
  18. Нестандартная форма окна приложения [черновик]
  19. Установка OpenCV на linux. Использование библиотеки в Qt Creator.
  20. Выбор кодировки текста
  21. Циклы в отдельном потоке.
  22. Сборка MySql драйвера под Windows
  23. Работа с SQLite

    Вопросы не касающиеся программирования:
  24. Исправляем кириллицу при ошибках компиляции

    что бы не забыть вопросы помечаю тут:
  25. Tableview tablewidget model и т.п.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KeyGen
383 / 290 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
06.10.2012, 19:47     Вопрос - Ответ для новичков по Qt #21
Установка OpenCV на linux. Использование библиотеки в Qt Creator.

Устанавливал на kubuntu (xubuntu, другие дистрибутивы не проверял...) вот каким макаром:

Устанавливаем cmake

Bash
1
sudo apt-get install cmake
далее, для отображения окошек OpenCV требуется установленная библиотека GTK+ 2.x или выше, в том числе заголовочные файлы (libgtk2.0-dev) устанавливаем:

Bash
1
apt-get install libgtk2.0-dev
Качаем последний доступную версию (на данный момент 2.4.2)

Кликаем мышкой по ссылке или пишем это в консоли и качаем:
wget https://github.com/KeyGen/OpenCV-download-2.4.2/zipball/master

или отсюда : http://sourceforge.net/projects/open...s/opencv-unix/

Распаковываем (скачано с помощю терминала (wget)):

Bash
1
unzip master
Заходим в дерикторию (KeyGen-OpenCV-download-2.4.2-5b1c3b8 цифры могут поменяться глянуть что у вас в каталоге можно написав в консоле: ls):

Bash
1
cd KeyGen-OpenCV-download-2.4.2-5b1c3b8
Теперь собираем библиотеку OpenCV:

from Dmitriy_M,
1. Для настройки проектов cmake есть gui/cli инструменты.
2. Так же может потребоваться сборка с отладочной информацией.

Bash
1
2
3
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ./
make
sudo make install
попробуем собрать примеры, которые идут в составе библиотеки:
Bash
1
2
3
cd samples/c/
sudo chmod +x build_all.sh
./build_all.sh
зпустим один из примеров:
Bash
1
./delaunay
здесь вы увидите либо красивую картинку, либо ошибку:

Bash
1
error while loading shared libraries: libopencv_core.so.2.2: cannot open shared object file: No such file or directory
— это значит, что программа не может найти требуемые библиотеки, пропишем их путь:

Bash
1
$ export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
здесь может выявиться ошибка:

Bash
1
OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvNamedWindow, file /usr/src/OpenCV-2.2.0/modules/highgui/src/window.cpp, line 274 terminate called after throwing an instance of 'cv::Exception' what(): /usr/src/OpenCV-2.2.0/modules/highgui/src/window.cpp:274: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you  are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvNamedWindow
это значит что вы забыли установить заголовочные файлы GTK+ 2.x: libgtk2.0-dev — выполните установку этого пакета и заново пересобирите OpenCV.

После установки заголовочные файлы OpenCV находятся в каталоге:
/usr/local/include/opencv

, а библиотечные файлы лежат в:
/usr/local/lib

Устанавливаем (если еще не установили Qt Creator):

Bash
1
sudo apt-get install qtcreator
Заходим в Qt Creator (kubuntu: приложения->разработка->Qt Creator)

Создаем новый проект:

Создать "проект"->"Другой прект"->"Консольное приложение Qt". Название уже сами...

В *.pro добовляем:

C++ (Qt)
1
LIBS += -lopencv_core -lopencv_imgproc -lopencv_highgui
В main пишем:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <opencv/cv.h>
#include <opencv2/highgui/highgui.hpp>
 
#include <stdlib.h>
#include <stdio.h>
 
int main()
{
        IplImage* image=0, *dst=0;
 
 
        // имя картинки задаётся первым параметром
        char filename[] = "foto.jpeg";
 
        // получаем картинку
        image = cvLoadImage(filename, 1);
 
        printf("[i] image: %s\n", filename);
        assert( image != 0 );
 
        // покажем изображение
        cvNamedWindow( "image");
        cvShowImage( "image", image );
 
        // ждём нажатия клавиши
        cvWaitKey(0);
 
        // освобождаем ресурсы
        cvReleaseImage(& image);
        cvReleaseImage(&dst);
 
        // удаляем окна
        cvDestroyAllWindows();
        return 0;
}
Картинку и ее путь укажите ваш например:

C++ (Qt)
1
char filename[] = "/home/keygen/Документы/foto.jpg";
Да и еще уберем галочку с запуска терминала:

Зайдите: "проекты"->"настройка запуска" и уберите галочку с "запускать в терминале"

Жмем Ctrl-b (собираем проект) Ctrl-r (запуск).

Должно выйти вот так:

Вопрос - Ответ для новичков по Qt




















Спасибо за внимание!

Программа пример:
Вложения
Тип файла: zip opencv.zip (27.4 Кб, 69 просмотров)
Чистый
Автор FAQ
2692 / 1388 / 71
Регистрация: 08.09.2011
Сообщений: 3,720
Записей в блоге: 1
02.11.2012, 15:00  [ТС]     Вопрос - Ответ для новичков по Qt #22
Сборка MySql для использование в Qt
И так надо собрать библиотеки для работы с MySql в Qt для этого пройдем несколько простых шагов:

1. Устанавливаем QtSDK, при установке обязательно отмечаем "QtSDK Source", тобишь нам нужны исходники Qt

2. Устанавливаем MySql Server 5, при установке отмечаем пункт "Client C API Library"

Теперь когда все что необходимо установлено делаем следующее:

3. Идем в каталог
QtSDK\QtSources\ваша_версия_qt\src\plugins\sqldrivers\mysql\
где QtSDK - каталог куда вы установили QtSDK на первом шаге

4. Находим файл mysql.pro в любом текстовом редакторе и добавляем строки:
INCLUDEPATH +="c:/Program Files/MySQL/MySQL Server 5.5/include"
LIBS+=-L"c:/Program Files/MySQL/MySQL Server 5.5/lib"
у вас путь может отличаться если вы изменяли его при установке MySql Server, подправьте относительно ваших путей. Сохраняем изменения и закрываем файл.

5. Запускаем командную строку MinGW (Пуск -> Все программы -> QtSDK -> Desktop -> Qt ваша_версия_qt for Desktop (MinGW))
6. Переходим в каталог QtSDK:
S:
cd QtSDK\QtSources\ваша_версия_qt\src\plugins\sqldrivers\mysql\
S: - Диск куда вы установили QtSDK, после каждой строки жмем Enter, в результате окажемся в каталоге в котором редактировали файл mysql.pro на шагах 3,4

7. Выполняем команду:
Bash
1
qmake mysql.pro
8.
Bash
1
mingw32-make
в результате в этом каталоге будут созданы каталоги debug и release и в каталоге debug появятся файлы libqsqlmysqld4.a и qsqlmysqld4.dll

9. Теперь для получения release сборки этих же библиотек выполняем команду:
Bash
1
qmake mysql.pro "CONFIG += release"
10.
Bash
1
mingw32-make
в результате в каталоге release появятся файлы libqsqlmysql4.a и qsqlmysql4.dll

11.теперь мы имеем 4 файла: libqsqlmysql4.a, qsqlmysql4.dll, libqsqlmysqld4.a, qsqlmysqld4.dll. Скидываем эти файлы в каталог QtSDK:
QtSDK\Desktop\Qt\ваша_версия_qt\mingw\plugins\sqldrivers\
Последний штрих, необходимо файл libmysql.dll скинуть в папку Windsows или любую другую которая описана в системной переменной PATH, взять эту библиотеку можно в каталоге куда установлен был MySql Server, у меня это тут:
c:\Program Files\MySQL\MySQL Server 5.5\lib\
все после чего Qt нормально будет работать с MySql
KeyGen
383 / 290 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
27.11.2012, 01:32     Вопрос - Ответ для новичков по Qt #23
Работа с SQLite - создание, просмотр, вставка, удаление

Создаем простой проект - GUI - приложение Qt. В *.pro файл нужно добавить sql

C++ (Qt)
1
QT       += sql
На форму добавим QTableWidget, двойным кликом добавим в таблицу столбец - Time, и три кнопки.
"Вставить" добавит id и системное время в таблицу. "Прочитать" прочет базу и вставит данные в QTableWidget. "Очистить" очистит всю базу.

Вопрос - Ответ для новичков по Qt


Для реализации, потребуются заголовочные файлы:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <QDebug>
#include <QTime>
#include <QMessageBox>
 
// Создадим папку
#include <QDir>
 
// Подключение
#include <QSqlDatabase>
#include <QSqlQuery>
 
// Чтение
#include <QSqlRecord>
Добавим функции, слоты как больше нравится
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
    int saveId;
 
private:
    // Подключение
    bool createConnection(QString path = "Database", QString name = "sqLite");
    // Создадим QTableWidget
    void createTableVerticalHeader(QStringList,QStringList);
 
private slots:
    // Вставка
    void insertDB();
    // Чтение
    void readDB();
    // Чистка
    void clearDB();
};
Ну и сама реализация, все прокомментировал:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    // Будет считать id
    saveId = 0;
 
    // Подсайденяемся к базе
    if(createConnection()){
 
        // Если все с подсоединением нормално соединяем кнопки
        connect(ui->insert,SIGNAL(clicked()),this,SLOT(insertDB()));
        connect(ui->read,SIGNAL(clicked()),this,SLOT(readDB()));
        connect(ui->clear,SIGNAL(clicked()),this,SLOT(clearDB()));
 
        // Чтение базы при старте
        readDB();
    }
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
bool MainWindow::createConnection(QString path, QString name)
{
    // Создаем папку если надо...
    QDir create;
    create.mkpath(path);
 
    // Подключаемся
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(path + "/" + name);
 
    // Проверяем все ли в порядке. Проблемы могут быть с правами...
    if (!db.open()) {
        qDebug() << tr("Cannot open database");
        return false;
    }
 
    // Создаем таблицу. Если таблица существует создавать вторую не будет...
    QSqlQuery query;
    QString   str  = "CREATE TABLE newtable ( "
            "id  VARCHAR(20), "
            "time VARCHAR(10) "
            ");";
 
    if (!query.exec(str)) {
        qDebug() << "Таблица уже имеется";
    }
 
    return true;
}
 
void MainWindow::insertDB(){
 
    // Добавим данные (1 = id, 2 = time) Не буду 
    // заморачиваться данные взял с фонаря - id, и системное время.
    QStringList value;
    value << QString::number(saveId++);
    value << QTime::currentTime().toString();
 
    // Проверим открытие
    bool openBL = true;
 
    QSqlQuery query;
    if (!query.exec("SELECT * FROM newtable;")) {
        qDebug() << "Unable to execute query - exiting";
        openBL = false;
    }
 
    if(openBL){
 
        //Adding some information
        QString str;
        QString strF =
                "INSERT INTO newtable (id, time) "
                "VALUES('%1', '%2');";
 
        str = strF.arg(value.at(0))
                    .arg(value.at(1));
 
        if (!query.exec(str)) {
            qDebug() << "Unable to do insert opeation";
        }
    }
}
 
void MainWindow::readDB(){
 
    // Проверим открытие
    bool openBL = true;
 
    // Подключаемся с таблице в базе
    QSqlQuery query;
    if (!query.exec("SELECT * FROM newtable;")) {
        qDebug() << "Unable to execute query - exiting";
        openBL = false;
    }
 
    if(openBL){
        // Чтение базы
        QSqlRecord rec = query.record();
 
        // Сохраним данные сюда
        QStringList id;
        QStringList time;
 
        // Чтение
        while (query.next()) {
            id << query.value(rec.indexOf("id")).toString();
            time << query.value(rec.indexOf("time")).toString();
        }
 
        // Создадим таблицу
        createTableVerticalHeader(id,time);
    }
}
 
void MainWindow::createTableVerticalHeader(QStringList id,QStringList time){
 
    // Проверим данные на всякий случай
    if(!id.isEmpty() && !time.isEmpty() && id.size() == time.size()){
 
        // Очистим tableWidget
        for(int i = ui->tableWidget->rowCount(); i>=0; i--)
            ui->tableWidget->removeRow(i);
 
        // Добавим количество вертикальных строк
        ui->tableWidget->setRowCount(id.size());
        // Добавим названия
        ui->tableWidget->setVerticalHeaderLabels(id);
 
        // Создаем таблицу
        QTableWidgetItem* ptwi = 0;
            for (int j = 0; j < time.size(); ++j){
                ptwi = new QTableWidgetItem(time.at(j));
                ui->tableWidget->setItem(j, 0, ptwi);
        }
    }
}
 
void MainWindow::clearDB(){
 
    if(ui->tableWidget->rowCount()){
        // Проверить убежденность человека в данном действии :)
        QMessageBox msgBox;
        msgBox.setIcon(QMessageBox::Critical);
        msgBox.setText(tr("Вы уверены что хотите очистить всю базу данных?"));
        msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
 
        if(msgBox.exec() == 16384){
 
            // Проверим открытие
            bool openBL = true;
 
            QSqlQuery query;
            if (!query.exec("SELECT * FROM newtable;")) {
                qDebug() << "Unable to execute query - exiting";
                openBL = false;
            }
 
            if(openBL){
 
                // Текст очистки
                QString strF = "DELETE FROM newtable";
 
                // Обнулим запись в id
                saveId = 0;
 
                // Обязательно проверка очистки
                if (!query.exec(strF)) {
                    qDebug() << "Unable to do delete opeation";
                }
                else{
                    // Чистим таблицу QTabelWidget
                    for(int i = ui->tableWidget->rowCount(); i>=0; i--)
                        ui->tableWidget->removeRow(i);
                }
            }
        }
    }
}
Вот что получилось:

Вопрос - Ответ для новичков по Qt

Вот так все просто. Качаем проект:
Вложения
Тип файла: zip SQLite.zip (10.4 Кб, 139 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2012, 00:57     Вопрос - Ответ для новичков по Qt
Еще ссылки по теме:
Не приходит ответ от QNetworkAccessManager::get C++ Qt
C++ Qt Как вывести ответ на окно?
C++ Qt Распаковывать gzip ответ QNetworkAccessManager
C++ Qt Qt Modbus ответ сервера по TCP
C# Есть вопрос не для новичков

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
KeyGen
383 / 290 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
28.11.2012, 00:57     Вопрос - Ответ для новичков по Qt #24
Система плагинов для вашего приложения. Часть вторая.

Создаем проект с поддиректориями. Добавляем проект GUI – он будет считывать наш плагин. Добавляем в поддиректории – Библиотека С++. Выбираем «Динамическая библиотека». Назовем Test. Далее, далее, далее…
В библиотеке будет два файла *.h. Один из них будет оканчиваться *_global.h я его использую под интерфейс (в принципе как вам угодно). Интерфейс выглядит так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef TEST_GLOBAL_H
#define TEST_GLOBAL_H
 
#include <QtPlugin>
 
// Предварительное обьявление класса
// (про методы он ничего не знает)
QT_BEGIN_NAMESPACE
class QAction;
QT_END_NAMESPACE
 
// Наследуем QObject
class Test : public QObject
{
    // Функции будут доступны
public:
    virtual QString getVersion()    = 0;
    virtual QString getName()       = 0;
    virtual QAction* getAction()    = 0;
 
    // Деструктор
    virtual ~Test() {}
 
    // Так обьявляем слот
public slots:
    // Будем переименовывать QAction
    virtual void slRenameAction(QString) = 0;
 
    // Ну и сигнал
signals:
    // Будем выводить сообщение для примера
    // В можете приспособить для своих нужд
    virtual void siSaveSetting(QString) = 0;
};
 
QT_BEGIN_NAMESPACE
    // Объявление этого класса как интерфейса для плагина
Q_DECLARE_INTERFACE(Test, "Test/Plagin/1.0")
 
QT_END_NAMESPACE
 
#endif // TEST_GLOBAL_H
Реализовываем наш плагин:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#ifndef TEST_H
#define TEST_H
 
#include "Test_global.h"
 
// Наследуем QObject
class TestClass : public Test
{
    // Макросы
    Q_OBJECT Q_INTERFACES(Test)
 
public:
    // Конструктор
    TestClass();
    // Наши виртуальные методы
    virtual QString getVersion()    { return "1.0"; }
    virtual QString getName()       { return "Test Plugin"; }
    virtual QAction* getAction()    { return action; }
 
    // Деструктор
    ~TestClass() {}
 
public slots:
    void slRenameAction(QString);
 
signals:
    void siSaveSetting(QString str = "SIGNAL emit");
 
private:
    // Добавим QAction
    QAction *action;
};
 
#endif // TEST_H
Так как мы используем QAction в *.pro файл добавим:
QT += gui

В *.cpp добавляем обязательно макрос ( добавлю, что макрос нужен в одном *.cpp. Если вы решите добавить еще файл он не нужен в нем)

В нашем случае:
C++ (Qt)
1
Q_EXPORT_PLUGIN(TestClass)
Файл реализации:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "test.h"
#include <QAction>
 
Q_EXPORT_PLUGIN(TestClass)
 
TestClass::TestClass(){
    // Создадим QAction
    action = new QAction(tr("Action TestPlugin"),this);
 
    // соединим наш action с нашим сигналом плагина
    connect(action,SIGNAL(triggered()),this,SIGNAL(siSaveSetting()));
}
 
// Реализация слота
void TestClass::slRenameAction(QString newName){
    action->setText(newName);
}
Добавим функцию чтения в проект с MainWindow и функция защиты если пригодится. Так же для проверки слота плагина добавим сигнал.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QDebug>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
 
private:
    // Укажем путь по умочанию
    void loadPlugins(QString pathPlugin = "../Test/debug");
    // Функция для контроля загрузки
    void controlLoadPlugin(QString);
 
signals:
    //  Сигнал с помощю него переименуем QAction плагина
    void renameAction(QString name = "new Text Action");
};
 
#endif // MAINWINDOW_H
В *.pro файл незабываем добавить include интерфейса. В нашем случае так:
INCLUDEPATH += $$PWD/../Test/

Реализация MainWindow:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
//-- Интерфейс плагина --//
#include "Test_global.h"
//-------------------------//
 
#include <QPluginLoader>
#include <QMessageBox>
#include <QMenu>
#include <QDir>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // Функция чтения плагинов
    loadPlugins();
 
    // Подключим элементы для переименования
    connect(ui->pushButton,SIGNAL(clicked()),this,SIGNAL(renameAction()));
}
 
MainWindow::~MainWindow() { delete ui; }
 
void MainWindow::loadPlugins(QString pathPlugin) {
 
    #ifdef Q_OS_WIN32
        QString enlargement = ".dll";   // Для Windows
        QString prefix = "";
    #endif
 
    #ifdef Q_OS_LINUX
        QString enlargement = ".so";    // Для Linux
        QString prefix = "lib";         // В Linux добовляется приставка lib...
    #endif
 
    // Решил зделать загрузку именно поимени
    // Можно сделать это и рекурсивно...
    QStringList readPluginsName;
    readPluginsName << "Test";
 
    for(int i = 0; i < readPluginsName.size(); i++){
        QDir findPlugin(pathPlugin);
 
        if(findPlugin.entryList().contains(prefix + readPluginsName.at(i) + enlargement)){
            QPluginLoader loader(pathPlugin + "/" + prefix + readPluginsName.at(i) + enlargement);
 
            // Исключаем ошибки
            if (loader.isLoaded())
            {
                qDebug() << QString("%1: %2 %3.")
                            .arg("Plugin file")
                            .arg(readPluginsName.at(i))
                            .arg(QObject::tr("is already loaded"));
                continue;
            }
 
            // Исключаем ошибки
            if (loader.load() == false)
            {
                qDebug() << QString("%1 %2\n%3: %4")
                            .arg(QObject::tr("Can't load a plugin"))
                            .arg(readPluginsName.at(i)).arg(QObject::tr("error"))
                            .arg(loader.errorString());
            }
            else
            {
                // Если прочитан и все в порядке
                QObject * obj = loader.instance();
 
                if (Test * plugin = qobject_cast<Test *>(obj))
                {
                    // Применяем нащ плагин
                    ui->label->setText("Прочитан плагин\n"
                                       "Имя: " + plugin->getName() +", Версия: "
                                       + plugin->getVersion());
 
                    ui->menuBar->addAction(plugin->getAction());
 
                    connect(plugin,SIGNAL(siSaveSetting(QString)),ui->label,SLOT(setText(QString)));
                    connect(this,SIGNAL(renameAction(QString)),plugin,SLOT(slRenameAction(QString)));
                }
            }
        }
        else{
            // Эта функция делает невозможным загрузку приложения
            // если плагин не найден а он жизненно необходим :)
            controlLoadPlugin(readPluginsName.at(i));
        }
    }
}
 
// Эта функция делает невозможным загрузку приложения
// если плагин не найден а он жизненно необходим :)
void MainWindow::controlLoadPlugin(QString LoadPlugin){
 
    QStringList listFindPlugin;
    // Просто добавим в QStringList "Жизненно необходимые" плагины
    listFindPlugin << "Test";
 
    if(listFindPlugin.contains(LoadPlugin)){
        QMessageBox msgBox;
        msgBox.setIcon(QMessageBox::Critical);
        msgBox.setText(tr("Not found plugin: ") + LoadPlugin + tr("    \nРабота приложения не возможна"));
        msgBox.setStandardButtons(QMessageBox::Cancel);
        msgBox.exec();
 
        // Завершение приложения
        QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection); // Завершение приложения
    }
}
Иногда Qt Creator бочинит. Все написано верно, проверенно сто раз и считывать плагин не хочет. Попробуйте изменить *.pro файл (допустить ошибку, а потом исправить) мне помогало

Вот, все работает:

Вопрос - Ответ для новичков по Qt

Пример приведенный здесь:
Вложения
Тип файла: zip PluginProject.zip (6.5 Кб, 88 просмотров)
Yandex
Объявления
28.11.2012, 00:57     Вопрос - Ответ для новичков по Qt
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru