Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для Maxfashko
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165

Чтение настроек

15.02.2016, 08:27. Показов 4598. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

На данный момент я реализовал чтение настроек в программе из реестра классом QSettings, все работает, но реализация кривая. Подскажите, как правильно?
Возможно структура самой программы неверная - я только учусь. Критика профессионалов - вот, что мне нужно. Прошу прощение за обильное кол-во кода - только так можно понять кривость моих рук. (Для понятия сути можно взглянуть на последние строки сообщения - там вся грусть)

Имеется базовый класс 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
//mainwindow.h
 
namespace Ui {
class MainWindow;
}
 
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
 
private:
    Ui::MainWindow *ui;
    
    //чтение и запись настроек из/в реестр
    void readSettings();
    void writeSettings();
 
    //объявляем дружественные классы для вычисления лица и реализации формы настроек
    faceDetect          *facedet = new faceDetect();
    Settings            *set = new Settings();
 
public slots:
    void changeSettings();              //It makes re-reading settings
В QDesigner создана главная форма приложения и объявлена в реализации mainwindow.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
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
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    readSettings();                //readsettings
    set->changeSet();           //заполняем ui.settings и ui.mainwindow настройками из реестра
 
    //соединяем слоты классов для передачи параметров настроек
    connect(facedet,SIGNAL(checkResize()),this,SLOT(checkResize()));        //check checkbox resize image
    connect(facedet,SIGNAL(getResizeValue()),this, SLOT(getResizeValue())); //get resize value
}
 
//читаем настройки
void MainWindow::writeSettings(){
    QSettings settings("BIOM","PassArt");
 
    //mainwindow
    settings.beginGroup("mainwindows");
    settings.setValue("selectedDirectory", selectedDir);
    settings.setValue("username", RegWin->username);
    settings.setValue("geometry", saveGeometry());
    settings.setValue("state", saveState(YOUR_UI_VERSION));
    settings.endGroup();
 
    //facedetect
    settings.beginGroup("Facedetect");
    settings.setValue("resizeValue", set->resizeValueFD);
    settings.setValue("resizeImg_bool", set->cB_resizeImg);
    settings.setValue("rotateImg_bool", set->cB_rotateImg);
    settings.setValue("showImg",set->cB_showImg);
    settings.endGroup();
}
 
void MainWindow::readSettings(){
 
    QSettings settings("BIOM", "PassArt");
 
    settings.beginGroup("mainwindows");
    selectedDir = settings.value("selectedDirectory").toString();
    username = settings.value("username").toString();
    restoreGeometry(settings.value("geometry").toByteArray());
    restoreState(settings.value("state").toByteArray(),YOUR_UI_VERSION);
    settings.endGroup();
 
    settings.beginGroup("Facedetect");
    set->cB_resizeImg = settings.value("resizeImg_bool").toBool();
    ui->checkBox->setChecked(set->cB_resizeImg);
    set->cB_rotateImg = settings.value("rotateImg_bool").toBool();
    ui->checkBox_3->setChecked(set->cB_rotateImg);
    set->resizeValueFD = settings.value("resizeValue").toInt();
    ui->lineEdit->setText(QString::number(set->resizeValueFD));
    set->cB_showImg = settings.value("showImg").toBool();
    settings.endGroup();
}
 
void MainWindow::changeSettings(){
 
    //запишем текушие настройки, чтобы не утерять их
    /* например user выбрал директорию в форме mainwindows и хочет использовать ее по умлч.
        если ее не сохранить, будет использоваться предыдущая сохраненная настройка
*/
    writeSettings();
 
    //прочтём настройки
    readSettings();
}
 
//слот для получения значения ресайза и установки переменной из класса facedetect
void MainWindow::getResizeValue(){
    facedet->resizeValue = ui->lineEdit->text().toInt();
}
 
//слот для получения значения чекбокса ресайз фото и установки переменной из класса facedetect
void MainWindow::checkResize(){
    facedet->cB_resize = ui->checkBox->isChecked();
}
 
//показываем окно с настройками
void MainWindow::on_showSet_clicked(){
    set->show();
}
Сама UI форма относящаяся к настройкам программы описана отдельно.

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
//settings.h
namespace Ui {
class Settings;
}
 
class Settings : public QDialog
{
    Q_OBJECT
 
public:
    explicit Settings(QWidget *parent = 0);
    ~Settings();
 
    void changeSet();
 
    //facedet
    int resizeValueFD, passAmount;
    bool cB_resizeImg, cB_rotateImg, cB_showImg;
 
private slots:
    void on_pushButton_clicked();
 
    void on_pushButton_2_clicked();
 
private:
    Ui::Settings *ui;
 
signals:
    void changeSettings();      //It makes re-reading the settings and displays mainwindows ui
};
 
//
реализация класса Settings

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
#include "settings.h"
#include "ui_settings.h"
 
#include <QSettings>
 
Settings::Settings(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Settings)
{}
 
Settings::~Settings()
{
    delete ui;}
 
 
//отображаем значения настроек в ui. Метод вызывается в конструкторе mainwindows
void Settings::changeSet(){
 
    //FD
    ui->checkBox_fd_rotateImg->setChecked(cB_rotateImg);
    ui->checkBox_fd_resizeImg->setChecked(cB_resizeImg);
    ui->lineEdit_fd_resizeValue->setText(QString::number(resizeValueFD));
    ui->checkBox_fd_showImg->setChecked(cB_showImg);
}
 
//save settings
void Settings::on_pushButton_clicked()
{
    //получаем текущие значения из edittext
    resizeValueFD = ui->lineEdit_fd_resizeValue->text().toInt();
    cB_resizeImg = ui->checkBox_fd_resizeImg->isChecked();
    cB_rotateImg = ui->checkBox_fd_rotateImg->isChecked();
    cB_showImg = ui->checkBox_fd_showImg->isChecked();
 
 
    //передаем сигнал о изменении настроек в mainwindows и их перезаписи и чтения
    emit changeSettings();
    close();
}
 
//закрытие формы
void Settings::on_pushButton_2_clicked()
{
    close();
}
Получается картинка, как на скриншоте. Пользователь может редактировать настройки не только из формы класса Settings, но еще и на самой форме класса MainWindow. Настройки проецируются на форму класса MainWindow из класса Settings. Это сделано для "удобного доступа" к самым часто используемым настройкам.

И теперь, для того чтобы в объявленном классе определения лица FaceDetect я мог получить настройку какого-либо параметра, мне нужно задействовать дохрена переменных. Вот здесь и все вопросы:

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
class faceDetect : public QObject
{
    Q_OBJECT
public:
    explicit faceDetect(QObject *parent = 0);
    //~faceDetect();
 
    //переменные для проверки статуса чекбоксов настроек
    bool cB_rotate,cB_resize;
 
    //значение ресайза из lineedit класса mainwindow
    int resizeValue;
 
private:
 
    //запуск сканирования лиц на фотоснимках
    int startDetect(QStringList &Stringlist, QString &Dirfolder);
 
signals:
 
    //получаем значение ресайза из lineedit класса mainwindow
    void getResizeValue();
 
    //проверка, отжат ли чекбокс "ресайз фото" на форме класса mainwindow
    void checkResize();
Получается, для того, чтобы класс facedetect получил любой параметр настроек из mainwindow:
соединяем слот с сигналом, в котором получаем значение параметра

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//FaceDetect.cpp
 
#include "faceDetect.h"
#include "mainwindow.h"
 
//запуск сканирования
int faceDetect::startDetect(QStringList &Stringlist, QString &Dirfolder)
{
 
//получаем значения параметров
//активирован ли ресайз фото
            emit checkResize();
 
//получаем значение ресайза
            emit getResizeValue();
}
В общем очень сложно при такой схеме добавлять новые параметры в настройки программы и далее их использовать.
Задействованы чуть ли не все классы, которые есть в программе.

Если я хочу добавить новый параметр настройки:
Я должен создать на форме класса Settings графическое представление параметра
Описать его в реализации класса Settings
Добавить чтение и запись этого параметра в класс MainWindow методы void MainWindow::readSettings(), void MainWindow::writeSettings()
В классе который запросит параметр (к примеру facedetect) создать переменную для данного параметра.
В классе MainWindow создать слот, который будет данной переменной присваивать значение параметра
В классе который запросит параметр (к примеру facedetect) создать сигнал для запроса параметра у класса MainWindow
В классе MainWindow соединить сигнал класса facedetect со слотом класса MainWindow
Миниатюры
Чтение настроек   Чтение настроек  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.02.2016, 08:27
Ответы с готовыми решениями:

Чтение файла CSV и чтение из Table View
Здравствуйте, задача считать столбцы и строки excel в TextEdit. Прошу помощи в реализиции. Вручную сохраняю xls файл в csv. Потом надо...

Чтение бинарного файла - чтение первых 9 байт
Есть код, который читает первые 9 байт бинарного файла(заголовок записи) void ATS44Encoder::FileEncode() { QFile* file = new...

Добавление настроек формы
Есть задача... Сохранять значения нескольких слайдеров в каком то объекте...При этом нужно чтобы пользователь мог добавлять новые...

12
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
15.02.2016, 10:14
Обособьте редактирование настроек.
Создайте у класса Settings сигнал SettingsChanged.
Далее в класс Settings добавьте операции ввода и вывода readSettings и SaveSettings.
При нажатии на "Применить" смотрите, были ли изменения в настройках и если были - генерируйте сигнал SettingsChanged. Сами настройки(или только изменённые части - необходимость в оптимизации тут на ваш выбор) записывайте в QSettings.
Подсоедините сигнал Settings.SettingsChanged к слоту MainWindow.readSettings(или к другому, чтобы провести отображение изменённых настроек). В MainWindow.writeSettings записывают только изменённые в MainWindow настройки.

Всё это - небольшое улучшение того, что вы делаете. А теперь расскажу как надо делать:
Обычно QSettings используют только для того, чтобы хранить настройки между сеансами запуска. Текущие рабочие настройки, на случай краха, обычно хранят в специальных временных файлах(наверняка ведь при работе с другими приложениями замечали у них создание файлов наподобии "*.autosave" и подобных? - вот это они и есть) и актуализируются(сохраняются) в специальных точках, которые задаются программистом. Иногда подобные точки представляют собой интервал времени, иногда - конкретные операции. Для хранения настроек в программе либо используют либо singleton, либо обычный класс-объект, который передают туда-сюда. При этом подобных объектов с настройками может быть несколько и они могут по разному реализовываться в зависимости от необходимости.
И то и другое обычно представляют из себя класс-контейнер, в котором находятся необходимые настройки. Класс обычно имеет сигнал, который уведомляет подключённые к нему объекты о том, что настройки внутри него изменились. И именно этот класс ответственен за сохранение/загрузку настроек.
1
 Аватар для Maxfashko
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
15.02.2016, 10:43  [ТС]
Wyn,
Цитата Сообщение от Wyn Посмотреть сообщение
Обособьте редактирование настроек.
Создайте у класса Settings сигнал SettingsChanged.
Далее в класс Settings добавьте операции ввода и вывода readSettings и SaveSettings.
При нажатии на "Применить" смотрите, были ли изменения в настройках и если были - генерируйте сигнал SettingsChanged. Сами настройки(или только изменённые части - необходимость в оптимизации тут на ваш выбор) записывайте в QSettings.
Подсоедините сигнал Settings.SettingsChanged к слоту MainWindow.readSettings(или к другому, чтобы провести отображение изменённых настроек). В MainWindow.writeSettings записывают только изменённые в MainWindow настройки.
В текущей ситуации ( и даже, если я изменю код подобным образом) у меня складывается ощущение что процесс чтения записи настроек разрознен по программе, то тут то там. И когда проходит к примеру месяц и я возвращаюсь к коду, нужно немалое кол-во времени чтобы въехать где что...

Так же при текущей реализации соединение сигнал-слот "медленное" (отстает что-ли?)

К примеру нижеследующий код не работоспособен (cB_rotate, cB_resize всегда будут false) :

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
//facedetect.cpp
 
int faceDetect::startDetect(QStringList &Stringlist, QString &Dirfolder)
{
 
    for(/*..........*/){
 
 
 
            //активирован ли переворот фото
            emit checkCB();
 
             //поворачиваем, если необходимо
            if(cB_rotate){
                //вычисляем ориентацию изображения из EXIF
                int orient = getExifOrient(fullName);
                //emit setText(QString::number(orient));
                if(orient > 0){
                    //переворачиваем изображение (перезапись), если необходимо
                    if( rotateImage90(orient, str)){
 
                        FSDK_FreeImage(fdImage);
 
                        if (FSDK_LoadImageFromFile(&fdImage, str) != FSDKE_OK)
                            emit setText("\nError loading rotate file!\n");
                    }
                }
            }
 
            //активирован ли ресайз фото
            emit checkResize();
 
            //получаем значение ресайза
            emit getResizeValue();
 
            if(cB_resize == true){
 
                //ресайз изображения
                if(resizeImage(resizeValue, str) !=0){
                    QString tmpStr = faultColor.arg("resize faul...");
                    emit setText(tmpStr);
                }
 
            }else{
                //qDebug()<<"NOT CB RESIZE";
            }
    }
 
 
}
Работоспособен только нижеследующий код:
Сначала отправляем сигналы, и только потом производим необходимые действия

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
//facedetect.cpp
 
int faceDetect::startDetect(QStringList &Stringlist, QString &Dirfolder)
{
    for(/*........*/){
 
            //активирован ли ресайз фото
            emit checkResize();
 
            //активирован ли переворот фото
            emit checkCB();
 
            //получаем значение ресайза
            emit getResizeValue();
 
 
             //поворачиваем, если необходимо
            if(cB_rotate){
                //вычисляем ориентацию изображения из EXIF
                int orient = getExifOrient(fullName);
                //emit setText(QString::number(orient));
                if(orient > 0){
                    //переворачиваем изображение (перезапись), если необходимо
                    if( rotateImage90(orient, str)){
 
                        FSDK_FreeImage(fdImage);
 
                        if (FSDK_LoadImageFromFile(&fdImage, str) != FSDKE_OK)
                            emit setText("\nError loading rotate file!\n");
                    }
                }
            }
 
 
            if(cB_resize == true){
 
                //ресайз изображения
                if(resizeImage(resizeValue, str) !=0){
                    QString tmpStr = faultColor.arg("resize faul...");
                    emit setText(tmpStr);
                }
 
            }else{
                //qDebug()<<"NOT CB RESIZE";
            }
 
    }
}
Цитата Сообщение от Wyn Посмотреть сообщение
При этом подобных объектов с настройками может быть несколько и они могут по разному реализовываться в зависимости от необходимости
Как бы вы посоветовали поступить в моем случае? Реализовать один класс с настройками которые часто изменяемы? Вроде - параметры ресайза, пользовательские директории, значения положения и размера главной формы программы. И сохранять их в директории с программой?
В конструкторе MainWindow получается, реализовать чтение?
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
15.02.2016, 11:19
Лучший ответ Сообщение было отмечено Maxfashko как решение

Решение

Цитата Сообщение от Maxfashko Посмотреть сообщение
Как бы вы посоветовали поступить в моем случае? Реализовать один класс с настройками которые часто изменяемы? Вроде - параметры ресайза, пользовательские директории, значения положения и размера главной формы программы. И сохранять их в директории с программой?
В конструкторе MainWindow получается, реализовать чтение?
Значения положения и размера форм программы и прочих подобных настроек - их лучше сохранять в какой-нибудь внутриформенной функции в каждой форме перед выходом из программы с помощью QSettings. Даже если программа покрашится - это будет не критично, просто загрузятся положения из предыдущего сеанса. Зато при любом изменении размеров не надо будет проводить операцию записи настроек. Также в QSettings можно сохранять изменяемые дефолтные рабочие настройки вашей программы.
Что вы имеете в виду под параметрами ресайза и пользовательскими директориями? Если они рабочие настройки вашей программы - то лучше их сохранять в отдельный файл по мере её работы.
Цитата Сообщение от Maxfashko Посмотреть сообщение
Как бы вы посоветовали поступить в моем случае? Реализовать один класс с настройками которые часто изменяемы?
Делайте как вам виднее и удобнее.

Добавлено через 6 минут
Ещё раз, коротко:
1) Параметры форм приложения и прочие подобные настройки - под них лучше вообще ничего не делать и обрабатывать при создании и удалении форм внутри класса форм.
2) Глобальные настройки(например изменяемые дефолтные рабочие настройки или пути в различных диалогах) - их лучше хранить в QSettings. Под них можно сделать синглтон.
3) Рабочие настройки - в зависимости от обстоятельств. Если у вас может быть их несколько, то синглтоном дело уже не обойдётся и придётся под них делать обычные объекты-классы, которые и передавать туда-сюда. Сохранять их в отдельный файл. Не надо мешать их с глобальными настройками приложения.
Всё просто.
1
 Аватар для Maxfashko
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
15.02.2016, 12:04  [ТС]
Цитата Сообщение от Wyn Посмотреть сообщение
2) Глобальные настройки(например изменяемые дефолтные рабочие настройки или пути в различных диалогах) - их лучше хранить в QSettings. Под них можно сделать синглтон.
Кстати, а как быть с многопоточностью?
У меня реализовано 2 потока через мьютексы на операции связанные с вычислением лица и отделением фона от фото.
классы facedetect, grabcut.
Не будет проблем с синглтоном?
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
15.02.2016, 12:12
Сигналы - твоё всё. Их реализация по умолчанию потокобезопасна.
1
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
15.02.2016, 12:42
Лучший ответ Сообщение было отмечено Maxfashko как решение

Решение

Цитата Сообщение от Maxfashko Посмотреть сообщение
Кстати, а как быть с многопоточностью?
У меня реализовано 2 потока через мьютексы на операции связанные с вычислением лица и отделением фона от фото.
классы facedetect, grabcut.
Не будет проблем с синглтоном?
facedetect и grabcut используют изменяемые настройки? Или ты их просто запускаешь с нужными тебе настройками и ждёшь их отклика? Если в первом случае - то конечно будет проблема и придётся использовать мютексы. Или, как посоветовали выше, лучше использовать стандартное связывание Qt через сигналы и слоты. Там есть потокобезопасные настройки. Если во втором, то причём тут настройки? Они же в них не используются.
1
 Аватар для Maxfashko
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
15.02.2016, 13:18  [ТС]
Wyn,
Цитата Сообщение от Wyn Посмотреть сообщение
facedetect и grabcut используют изменяемые настройки? Или ты их просто запускаешь с нужными тебе настройками и ждёшь их отклика?
Метод определения лица к примеру, запускается в цикле по кол-ву файлов в дирректории, проверяет настройки на каждой итерации цикла. Сделано для изменения настроек в процессе работы метода.
Так же и метод в классе grabcut. Вот.

Добавлено через 9 минут
Масло маслянное. Точнее вот так:
Метод определения лица состоит из цикла в котором проверяет настройки каждый раз перед вызовом функциии вычисления области лица.
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
15.02.2016, 13:21
Цитата Сообщение от Maxfashko Посмотреть сообщение
Метод определения лица к примеру, запускается в цикле по кол-ву файлов в дирректории, проверяет настройки на каждой итерации цикла. Сделано для изменения настроек в процессе работы метода.
Так же и метод в классе grabcut. Вот.
Как-то мне тебя трудно понять.
Но если ты считаешь, что будут проблемы с синглтоном - то просто не реализовывай его, в чём проблема? Используй сигналы и слоты для загрузки в поток актуальных настроек.
0
 Аватар для Maxfashko
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
15.02.2016, 13:31  [ТС]
Wyn, потом пеюодредактировал сообщение.
В любом случае спасибо!

З.ы. про "тормознутость" сигнал слотов, это нормально?
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
15.02.2016, 13:35
Лучший ответ Сообщение было отмечено Maxfashko как решение

Решение

Цитата Сообщение от Maxfashko Посмотреть сообщение
З.ы. про "тормознутость" сигнал слотов, это нормально?
"Тормазнутость" - понятие растяжимое. Я бы, к примеру, не стал реализовывать научные подсчёты или высоконагруженные БД через них, но для требований интерфейса слотов хватает с лихвой. Рекомендую использовать синтаксис Qt5, который с указателями на функции.
0
 Аватар для Maxfashko
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
15.02.2016, 13:44  [ТС]
Очень долго не мог понять почему сразу после того как отправляем сигнал в слот, проверяющий состояние чекбокса, тот постоянно возвращал false, даже если чекбокс был отжат.
Не критично, но может сбить с толку.
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
15.02.2016, 14:53
Цитата Сообщение от Maxfashko Посмотреть сообщение
З.ы. про "тормознутость" сигнал слотов, это нормально?
За всё приходится платить. Да и тормознутость там присутствует только если сранивать с прямым вызовом функции.
Цитата Сообщение от Maxfashko Посмотреть сообщение
Метод определения лица состоит из цикла в котором проверяет настройки каждый раз перед вызовом функциии вычисления области лица.
Честно говоря я вообще не понимаю как в такой операции как определение лица могут быть изменяемые при её выполнении настройки. По моему сугубому мнению, если настройки изменились - значит должна происходить отмена операции. Старый поток распознавания лица должен завершаться, а вместо него запускаться новый, уже с новыми настройками.
Цитата Сообщение от Maxfashko Посмотреть сообщение
Очень долго не мог понять почему сразу после того как отправляем сигнал в слот, проверяющий состояние чекбокса, тот постоянно возвращал false, даже если чекбокс был отжат.
Не критично, но может сбить с толку.
Хбз. Может потому что ты его неправильно подключал(использовал неправильные опции).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2016, 14:53
Помогаю со студенческими работами здесь

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

Сохранение настроек приложения
Добрый день. Мне нужно сохранить настройки программы. Каким образом можно сделать? Приведите небольшой пример сохранения пары ключ -...

QSerialPort передача настроек с файла конфигурации
Добрый день. Туплю что-то я...подскажите пожалуйста... стандартные настройки QSerialPort (setOpenMode, setBaudRate, setParity и т.д.)...

Чтение настроек из файла XML
Всем здравствуйте. Проблема вот такая: надо правильно считать настройки из XML, т.е. есть Project а в нём 1 Settings и куча Cooperative....

Сохранение настроек и их чтение в программе.
Как лучше организовать сохранение настроек и их чтение в прогремме подсчета денег за инет,сохранять нужно крайние даты промежутка времени ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru