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

Qt

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

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

21.02.2012, 11:15. Просмотров 84220. Ответов 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 и т.п.
24
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2012, 11:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос - Ответ для новичков по Qt (C++ Qt):

Игры на qt для новичков - C++ Qt
Здравствуйте форумчане. Какие книги или сайты посоветуете чтобы начать писать игры на qt без использования Qt дизайнер.

QT widget (для новичков) - C++ Qt
вопрос проще некуда,но я нуб и непонимаю. открыл тему на форуме http://www.cyberforum.ru/qt/thread79698.html. и там в примере ...

Посоветуйте книгу для новичков - C++ Qt
Недавно я программировал на C++ builder 6 и понял, что это уже пережитки прошлого. Нашёл и установил qt - нормальная современная среда,...

Есть вопрос не для новичков - C#
я написал функцию которая содаёт динамически ДатаТайбл, но я определяю зарание известный класс, она отуда тянет проперти и создает...

Как реализовать приложение для тестирования (вопрос/ответ) - Программирование Android
Всем привет, я пока что андроид лузер, начал писать програмку с тестами так как тестов планируется несколько, то собрал их в листвью на...

Ответ на вопрос - C++
Блин препод задал вопрос не знаю как ответить на него и почему такой ответ? вот вопрос: Какой порядок вызова методов/конструкторов? ...

23
KeyGen
384 / 291 / 6
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
13.08.2012, 20:05 #16
Работа с zip архивами в Qt (разархивация)

В Qt есть не документированные классы для работы с zip архивами. Эти классы позволяют распаковывать уже существующие архивы по заданному пути, так и создавать новые архивы. Для создания используется класс QZipWriter, для распаковки QZipReader. Для использования этих классов предлагаю скопировать указанные файлы в свой проект и добавить их в компиляцию.

Напишу способ разархивирования zip файлов из заданной директории.
Воспользуемся классом QZipReader.

В папку с пограммой добавим папку qzip (прилагается к посту). Ее содержимое:
qzipreader_p.h
qzipwriter_p.h
qzip.cpp

QZipReader и QZipWriter используют библеотеку zlib. На linux проблем не возникало, а при переносе прграммы на Windows библиотека zlib небыла найдена. Поэтому я изночально включил в проект эту библиотеку:

Папка zlib:
zlib-1.2.5.zip - полная библиотека zlib
zlib125dll.zip - dll zlib
// файлы которые потребуються для QZipReader и QZipWriter
zlib.h
zconf.h.in
zconf.h

Создадим функцию которая будет принемать путь к дериктории и возвращать результат:
1 - разархивация прошла успешно
0 - ошибка разорхивации

int readerZip(QString str);

Подключение библиотеки будет выглядеть в нашем случае вот так:
C++ (Qt)
1
2
#include "qzip/qzipreader_p.h"  // для распаковки
#include "qzip/qzip.cpp"
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
// Распаковка zip
int MainWindow::readerZip(QString str)
{
    QDir dir(str.toAscii());    // Создаем QDir в указанном пути (str)
 
    QStringList filters;                // Устанавливаем фильтры
    filters << "*.zip";                 // Устанавливаем фильтры
    dir.setNameFilters(filters);        // Устанавливаем фильтры
 
    QFileInfoList list = dir.entryInfoList();   // Чтение инфо о файлах в указанном пути (str) c раширением zip
 
    for (int i = 0; i < list.size(); ++i) {
 
        QZipReader zip_reader(QLatin1String(str.toAscii() + "/" + list.at(i).fileName().toAscii())); // чтение указанного zip архива
 
        if (zip_reader.exists()) {          // Если все чудно
 
            // вывод информации об архиве
            qDebug() << "Количество элементов в архиве =" << zip_reader.count(); // Количество элементов в архиве
 
            foreach (QZipReader::FileInfo info, zip_reader.fileInfoList()) { // Инфорация о архиве
                if(info.isFile)
                    qDebug() << "File:" << info.filePath << info.size; // размер извлекаемого файла
                else if (info.isDir)
                    qDebug() << "Dir:" << info.filePath;
                else
                    qDebug() << "SymLink:" << info.filePath;
            }
 
            // распаковка архива по указанному пути
            zip_reader.extractAll(str.toAscii());
        }
        else
        {
            // Вернем ошибку
            return 0;
        }
    }
 
    return 1;
}
Удачи!

qzip.zip - библиотеки
zipreader.zip - программа-пример
6
Миниатюры
Вопрос - Ответ для новичков по Qt  
Вложения
Тип файла: zip qzip.zip (1.46 Мб, 193 просмотров)
Тип файла: zip zipreader.zip (1.46 Мб, 180 просмотров)
KeyGen
384 / 291 / 6
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
04.09.2012, 11:54 #17
QLabel. Размер текста относительно ширины QLabel.

При увеличении шрифта текста и вывод его на QLabel он не всегда поместиться на обьекте и может выйти за границы:

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

















Для того что бы этого не случалось. Если ширина текта привысит ширину обьекта будем его уменьшать - чем длиннее текст тем меньше шрифт.

QLabel принимает html код. Воспользуемся этим. Вот мое произвидение на эту тему:

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
// Функция устанавливающая размер шрифта относительно размера окна
QString MainWindow::setWidthFont(QString str, int maxwidth, int maxfont)
{
    /*
      str = текст передоваемый для проверки на размер
      maxwidth = размер нашего окна
      maxfont = максимально-нужный размер текста
    */
 
 
    QString newHtml;    // Будуший текст
 
    QFont font; // Это QFont :)
 
    int i;
    for(i = maxfont; i>0; i--)
    {
        font.setPixelSize(i);   // Циклом проверяем оптимально подходящий размер
 
        if(QFontMetrics(font).width(str) < maxwidth-10) // Если ширина шрифта меньше ширины mazwidth
        {
            break;
        }
    }
 
    // Создаем html с нужным нам размером
    newHtml = "<center>";   // Отцентрируем текст
    newHtml += "<span style=" font-size:" + QString::number(i,10) + "px;">" + str + "</span>";
    newHtml += "</center>"; // Отцентрируем текст
 
    return newHtml; // Готово, возвращаем QString
}
Вот пример приминения:
C++ (Qt)
1
ui->label->setText(setWidthFont(words.at(3)/*Слово/Текст*/,ui->label->width()/*Размер QLabel*/,70/*Нужный размер шрифта*/));

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

















Удачи!
Программа-пример прилагается:
5
Вложения
Тип файла: zip Font_size.zip (3.2 Кб, 73 просмотров)
KeyGen
384 / 291 / 6
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
06.09.2012, 14:32 #18
Qml. Обьединение Qml и виджетов Qt

Допусти имеется у нас итерфейс на qml:

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
// import QtQuick 1.0 // to target S60 5th Edition or Maemo 5
import QtQuick 1.1
 
Rectangle {
    id: main
    objectName: "main"
 
    width: 800
    height: 250
 
    color: "black"
 
    smooth: true
 
    Rectangle{
        id: mainMenu
 
        width: 800
        height: 0 // Обратите внимание!
                     // Это вам может пригодиться если нужно будет перемещать mainMenu (id) 
                     //(его не будет видно!) и не трогать main (id). В данном случае мы 
                     //перемещение mainMenu не используем, а перемещаем main (id).
 
        state: "normal"
 
        states: [
            State {
                name: "normal"
                PropertyChanges {target: main; x:0;}
            },
            State {
                name: "shift"
                PropertyChanges {target: main; x: -400}
            }
        ]
 
        transitions: Transition {
            PropertyAnimation { properties: "x"; duration: 500; easing.type: Easing.InOutSine }
        }
 
        Rectangle{
            id: one
 
            x: 10
            y: 10
 
            objectName: "one"
 
            color: "green"
 
            width: 380
            height: 230
 
            radius: 20
            smooth: true
 
            Text {
                id: text
                font.pixelSize: 40
 
                text: qsTr("Hello world!")
 
                anchors.verticalCenter: one.verticalCenter
                anchors.horizontalCenter: one.horizontalCenter
            }
 
            Rectangle{
                id: up
                width: 100
                height: 30
 
                x: parent.width/2 - up.width/2
                y: parent.height - up.height - 10
 
                radius: 20
                smooth: true
 
                Text{
                    text: "Далее >>"
 
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.horizontalCenter: parent.horizontalCenter
                }
 
                scale: buttonMouse.pressed? 0.8 : 1.0
 
                MouseArea {
                    id: buttonMouse
                    anchors.fill: parent
                    acceptedButtons: Qt.LeftButton | Qt.RightButton
                    onClicked:
                    {
                        mainMenu.state = "shift";
                    }
                }
            }
        }
 
        Rectangle{
            id: two
 
            x: 410
            y: 10
 
            objectName: "two"
 
            color: "yellow"
 
            width: 380
            height: 230
 
            radius: 20
            smooth: true
 
            Text {
                id: textTwo
                font.pixelSize: 40
 
                text: qsTr("Goodby world!")
 
                anchors.verticalCenter: parent.verticalCenter
                anchors.horizontalCenter: parent.horizontalCenter
            }
 
            Rectangle{
                id: down
                width: 100
                height: 30
 
                x: parent.width/2 - up.width/2
                y: parent.height - up.height - 10
 
                radius: 20
                smooth: true
 
                Text{
                    text: "<< Назад"
 
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.horizontalCenter: parent.horizontalCenter
                }
 
                scale: buttonMouseTwo.pressed? 0.8 : 1.0
 
                MouseArea {
                    id: buttonMouseTwo
                    anchors.fill: parent
                    acceptedButtons: Qt.LeftButton | Qt.RightButton
                    onClicked:
                    {
                        mainMenu.state = "normal";
                    }
                }
            }
        }
    }
}

Он переключает с помощью кнопки "Далее >>" или "<< Назад" между двумя формами Rectangle.

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


















Добавим на форму "Goodby world!" (two) допустим обьект QListWidget. Добавляем его так:

MainWindow.h
C++ (Qt)
1
2
3
4
5
6
...
#include <QListWidget>
...
private:
QListWidget *list;
...
MainWindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
    list = new QListWidget(this);
    list->setFixedSize(360,70); // Установим его размер
    list->move(420,20);     // Установим нужое положение
                            // (при перемещении нашей формы "Goodby world!"
                            // будем перемещать и QListWidget)
    // Добавим intems для наглядности
    list->addItem("one item");
    list->addItem("two item");
    list->addItem("three item");
    list->addItem("four item");
В MainWindow.h добавим функцию которая нам позволит перемещать наш обьект QListWidget:

C++ (Qt)
1
2
3
4
5
6
7
...
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
    Q_INVOKABLE void moveobject(int);      // Функция C++ вызываемая из QML для зименения положения QListWidget
...
В MainWindow.cpp реализация:
C++ (Qt)
1
2
3
4
5
6
7
// Функция C++ вызываемая из QML для зименения положения QListWidget
void MainWindow::moveobject(int x)
{
    list->move(420 + x,20);     // Установим нужое положение
                            // (при перемещении нашей формы "Goodby world!"
                            // будем перемещать и QListWidget)
}
В *.qml (в программе-примере main.qml):

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
...
                Text{
                    text: "<< Назад"
 
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.horizontalCenter: parent.horizontalCenter
                }
 
                scale: buttonMouseTwo.pressed? 0.8 : 1.0
 
                MouseArea {
                    id: buttonMouseTwo
                    anchors.fill: parent
                    acceptedButtons: Qt.LeftButton | Qt.RightButton
                    onClicked:
                    {
                        mainMenu.state = "normal";
                    }
                }
            }
        }
    }
 
    onXChanged: Qt_fun.moveobject(main.x) // Передает сигнал при перемещении main (id)
}
Ну вот и все:

Нажмите на изображение для увеличения
Название: 96460754804433736524.png
Просмотров: 7
Размер:	15.8 Кб
ID:	587527
Вопрос - Ответ для новичков по Qt


















Удачи!

Программа-пример:
5
Вложения
Тип файла: zip Qml-qt.zip (3.7 Кб, 83 просмотров)
KeyGen
384 / 291 / 6
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
12.09.2012, 00:39 #19
Циклы в отдельном потоке.

При запуске цикла происходит подвесание GUI. Если вам нужно во время его (цикла) работы выводить информацию на GUI можно применить обновление отображения всей программы:

C++ (Qt)
1
QApplication::processEvents();
Это ресурсоемкая операция не лучший вариант.

Для долгих циклов можно создать отдельный поток его обработки.

Описываем свой класс, который будет проводить все действия:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyClass : public QObject
{
    Q_OBJECT
 
public:
    explicit MyClass(QObject *parent = 0);
 
private:
    bool needStop; // эта переменная нам будет сигнализировать, что пора завершать работу
 
signals:
    void finished();  // сигнал будем вызвать, когда закончили работу
    void sendString(QString); // через этот сигнал будем общаться с главным окном
 
public slots:
    void start(); // в этом слоте будут выполняться все действия
    void stop(); // этот слот будет говорить нам, что пора завершать работу (просто сделает needStop=true)
};
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
MyClass::MyClass(QObject *parent) :
    QObject(parent)
{
    needStop = false;
}
 
void MyClass::start() // будем имитировать полезное действие... просто сравнивать время и каждую секунду обращаться к окну
{
    QDateTime dt = QDateTime::currentDateTime();
    uint curSec = dt.toTime_t();
    while (!needStop) // пока переменная needStop=false
    {
        dt = QDateTime::currentDateTime(); // проверяем время
        if (curSec!=dt.toTime_t()) // изменилась ли секунда
        {
            curSec=dt.toTime_t();  // обновить секунды и...
            emit sendString(dt.toString()); // вызвать сигнал, который отправит строку в главное окно
        }
    }
    emit finished(); // вызываем сигнал, что мы закончили работу
}
 
void MyClass::stop()
{
    needStop = true; // думаю, комментарии не нужны
}

На форме ставим две кнопки и QLabel для вывода получаемого сигнала из нашего класса
Вопрос - Ответ для новичков по Qt













C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
 
private slots:
    void on_pushButton_clicked();  // слот для первой кнопки будет запускать поток
};
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
#include <QThread>
#include <QDateTime>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
void MainWindow::on_pushButton_clicked()
{
    QThread *thread = new QThread;  // создаём поток... вначале он создаётся остановленным
 
    MyClass *job = new MyClass; // создаём экземпляр нашего класса
 
    job->moveToThread(thread); // наш класс мы уводим на только что созданный поток... теперь класс будет выполняться независимо от главного окна
    connect(thread,SIGNAL(started()),job,SLOT(start())); // когда поток стартует, то начать выполнение работы нашего класса
    connect(job,SIGNAL(finished()),thread,SLOT(quit())); // когда работа будет завершена, завершить поток
    connect(job,SIGNAL(finished()),job,SLOT(deleteLater())); // когда работа будет завершена, удалить наш экземпляр класса
    connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater())); // когда поток остановится, удалить его
    //connect(job,SIGNAL(sendString(QString)),this,SLOT(reciveString(QString))); // соединить сигнал передачи строки нашего класса со слотом главного окна
    connect(ui->pushButton_2,SIGNAL(clicked()),job,SLOT(stop()),Qt::DirectConnection); // при нажатии на вторую кнопку вызывать MyClass::stop()
           // обрати внимание, что там ещё указан пятый параметр Qt::DirectConnection... он необходим, т.к. наш класс работает в цикле без перерывов
           // и без этого параметра наш сигнал никогда не достигнет слота класса.
           // Если бы мы класс делали основанным на событиях, где функции время от времени завершают работу, тогда этот параметр можно было не указывать.
    thread->start(); // всё настроено, теперь просто запускаем поток.
 
 
    connect(job,SIGNAL(sendString(QString)),ui->label,SLOT(setText(QString))); // Подсоединим сигнал нашего класса к слоту label
}
Ну вот что получилось:
Вопрос - Ответ для новичков по Qt














Удачи! Спасибо Humanoid.

Программа:
5
Вложения
Тип файла: zip cycle_stream.zip (4.3 Кб, 138 просмотров)
KeyGen
384 / 291 / 6
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
19.09.2012, 23:22 #20
Выбор кодировки текста

Для отображения нужной кодировки текста в программе можно преобразовать кодировку в нужную нам.

Допустим мы имеем форму:

(QLabel, QComboBox)

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














Добавим в наш MainWindow slot и QString:

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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QTextCodec>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
    QString text; // Этой строке будем менять кодировку
 
private slots:
    void setCodec(QString); // Слот для изменения кодека
};
 
#endif // MAINWINDOW_H
В comboBox добавим нужные нам кодировки и подключим слот:

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
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    QStringList listCodec;
    // Вот некоторые кодеки из доступных в Qt
    listCodec << "Apple Roman";
    listCodec << "Big5";
    listCodec << "Big5-HKSCS";
    listCodec << "CP949";
    listCodec << "EUC-JP";
    listCodec << "EUC-KR";
    listCodec << "KOI8-R";
    listCodec << "KOI8-U";
    listCodec << "MuleLao-1";
    listCodec << "ROMAN8";
    listCodec << "Shift-JIS";
    listCodec << "TIS-620";
    listCodec << "TSCII";
    listCodec << "UTF-8";
    listCodec << "UTF-16";
    listCodec << "UTF-16BE";
    listCodec << "Windows-1250"; // to 1258
    listCodec << "Windows-1251"; // Русский
 
    text = "Русский";
    ui->label->setText(text);
 
    // Добавим из в comboBox
    ui->comboBox->addItems(listCodec);
 
    // Подключим сигнал изменеия comboBox
    connect(ui->comboBox,SIGNAL(activated(QString)),this,SLOT(setCodec(QString)));
 
    // Установим comboBox на нашу кодировку
    ui->comboBox->setCurrentIndex(listCodec.indexOf("UTF-8"));
 
}

А вот реализация слота для преобразования кодека:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
// Слот для изменения кодека
void MainWindow::setCodec(QString newCodec)
{
    // Выбор кодека
     QTextCodec *codec = QTextCodec::codecForName(newCodec.toAscii());
 
     // Изменяем кодировку
     QByteArray encodedString = codec->fromUnicode(text);
 
     // В label вписываем текст с новой кодировкой
     ui->label->setText(encodedString);
}
Вот что получилось:
Вопрос - Ответ для новичков по Qt Вопрос - Ответ для новичков по Qt















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

Программа-пример прилагается:
4
Вложения
Тип файла: zip codec.zip (5.4 Кб, 143 просмотров)
KeyGen
384 / 291 / 6
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
06.10.2012, 19:47 #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/opencvlibrary/files/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




















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

Программа пример:
3
Вложения
Тип файла: zip opencv.zip (27.4 Кб, 70 просмотров)
Чистый
Автор FAQ
2707 / 1403 / 73
Регистрация: 08.09.2011
Сообщений: 3,733
Записей в блоге: 1
02.11.2012, 15:00  [ТС] #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
9
KeyGen
384 / 291 / 6
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
27.11.2012, 01:32 #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

Вот так все просто. Качаем проект:
1
Вложения
Тип файла: zip SQLite.zip (10.4 Кб, 141 просмотров)
KeyGen
384 / 291 / 6
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
28.11.2012, 00:57 #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

Пример приведенный здесь:
3
Вложения
Тип файла: zip PluginProject.zip (6.5 Кб, 88 просмотров)
28.11.2012, 00:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2012, 00:57
Привет! Вот еще темы с ответами:

Ответ на вопрос. - Turbo Pascal
Вот задали мне с информатики написать програмку на паскале, чтобы она задавала вопрос, и пользователь мог ответить &quot;y&quot;(yes) или &quot;n&quot;(no); ...

Ответ на вопрос по С++ - C++
определение объединения (union), синтаксис, назначение спасибо

Ответ на вопрос. - Базы данных
Всем здравствуйте. Предмет: Управление данными. Ответьте, пожалуйста, на вопрос: 98. Как можно добавить в таблицу данные из другой...

Нужен ответ на вопрос!!! - Pascal
Организация и использование модулей пользователя. Добавлено через 1 минуту Никак немогу найти ответ на этот вопрос!!!!...


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

Или воспользуйтесь поиском по форуму:
24
Закрытая тема Создать тему
Опции темы

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