Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions src/src/Settings.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2020 ~ 2021 Uniontech Software Technology Co.,Ltd.
// Copyright (C) 2020 ~ 2026 Uniontech Software Technology Co.,Ltd.
// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later
Expand Down Expand Up @@ -155,17 +155,23 @@ void Settings::setNewResolutionList()

for (int i = 0; i < resolutionDatabase.size(); i++) {
QStringList resolutiontemp = resolutionDatabase[i].split("x");
if ((v4l2core_get_frame_width(get_v4l2_device_handler()) == resolutiontemp[0].toInt()) &&
(v4l2core_get_frame_height(get_v4l2_device_handler()) == resolutiontemp[1].toInt())) {
if (resolutiontemp.size() >= 2 &&
v4l2core_get_frame_width(get_v4l2_device_handler()) == resolutiontemp[0].toInt() &&
v4l2core_get_frame_height(get_v4l2_device_handler()) == resolutiontemp[1].toInt()) {
defres = i; //set selected resolution index
break;
}
}

// 抑制中间态的 resolutionchanged, 仅在最后发射一次正确值
m_updatingResolution = true;
resolutionmodeFamily->setData("items", resolutionDatabase);

//设置当前分辨率的索引
m_settings->setOption(QString("outsetting.resolutionsetting.resolution"), defres);
QTimer::singleShot(0, this, [this, resolutionDatabase, defres]() {
m_updatingResolution = false;
if (defres >= 0 && defres < resolutionDatabase.size()) {
emit resolutionchanged(resolutionDatabase[defres]);
}
});
} else {
resolutionDatabase.clear();
resolutionDatabase.append(QString(tr("None")));
Expand Down Expand Up @@ -222,6 +228,8 @@ QVariant Settings::getBackOption(const QString &opt)
void Settings::onValueChanged(const QString & key, const QVariant & value)
{
if (key.startsWith("outsetting.resolutionsetting.resolution")) {
if (m_updatingResolution)
return;
auto mode_opt = m_settings->option("outsetting.resolutionsetting.resolution");
if (value >= 0 && mode_opt->data("items").toStringList().size() > value.toInt()) {
QString mode = mode_opt->data("items").toStringList()[value.toInt()];
Expand Down
3 changes: 2 additions & 1 deletion src/src/Settings.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2020 ~ 2021 Uniontech Software Technology Co.,Ltd.
// Copyright (C) 2020 ~ 2026 Uniontech Software Technology Co.,Ltd.
// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later
Expand Down Expand Up @@ -160,6 +160,7 @@ public slots:
QString m_configPath;
QPointer<DSettings> m_settings;
QSettingBackend* m_backend;
bool m_updatingResolution = false;
};

}
Expand Down
23 changes: 15 additions & 8 deletions src/src/mainwindow.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2020 ~ 2021 Uniontech Software Technology Co.,Ltd.
// Copyright (C) 2020 ~ 2026 Uniontech Software Technology Co.,Ltd.
// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later
Expand Down Expand Up @@ -1148,15 +1148,21 @@ void CMainWindow::settingDialog()

}

for (int i = 0; i < resolutionDatabase.size(); i++) {
QStringList resolutiontemp = resolutionDatabase[i].split("x");
int savedRes = resolutionmodeFamily->value().toInt();
if (savedRes >= 0 && savedRes < resolutionDatabase.size()) {
defres = savedRes;
} else {
for (int i = 0; i < resolutionDatabase.size(); i++) {
QStringList resolutiontemp = resolutionDatabase[i].split("x");

if (resolutiontemp.size() >= 2 &&
v4l2core_get_frame_width(get_v4l2_device_handler()) == resolutiontemp[0].toInt() &&
v4l2core_get_frame_height(get_v4l2_device_handler()) == resolutiontemp[1].toInt()) {
defres = i; //设置分辨率下拉菜单当前索引
break;
}

if ((v4l2core_get_frame_width(get_v4l2_device_handler()) == resolutiontemp[0].toInt()) &&
(v4l2core_get_frame_height(get_v4l2_device_handler()) == resolutiontemp[1].toInt())) {
defres = i; //设置分辨率下拉菜单当前索引
break;
}

}

resolutionmodeFamily->setData("items", resolutionDatabase);
Expand Down Expand Up @@ -1994,6 +2000,7 @@ void CMainWindow::initRightButtons()
connect(&m_fileWatcherUp, SIGNAL(fileChanged(const QString &)), this, SLOT(onDirectoryChanged(const QString &)));
//摄像头切换成功信号
connect(m_videoPre, SIGNAL(switchCameraSuccess(const QString &)), this, SLOT(onSwitchCameraSuccess(const QString &)));
connect(m_videoPre, SIGNAL(switchCameraSuccess(const QString &)), &Settings::get(), SLOT(setNewResolutionList()));
locateRightButtons();
}

Expand Down
6 changes: 2 additions & 4 deletions src/src/videowidget.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2020 ~ 2021 Uniontech Software Technology Co.,Ltd.
// Copyright (C) 2020 ~ 2026 Uniontech Software Technology Co.,Ltd.
// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later
Expand Down Expand Up @@ -1217,9 +1217,7 @@ int videowidget::switchCamera(const char *device, const char *devName)
m_imgPrcThread->start();
DataManager::instance()->setdevStatus(CAM_CANUSE);
//切换摄像机成功,发送设备名称信号到主界面。
if (devName && strlen(devName)) {
emit switchCameraSuccess(devName);
}
emit switchCameraSuccess(devName ? devName : "");
dc::Settings::get().setBackOption("device", device);
} else if (ret == E_FORMAT_ERR) {
v4l2_dev_t *vd = get_v4l2_device_handler();
Expand Down
Loading