主要代码在properties-view.cpp
rtmp的URL ,key 对应的QLineEdit是在程序内动态生成的
QWidget *OBSPropertiesView::AddText(obs_property_t *prop, QFormLayout *layout,
QLabel *&label)
{
const char *name = obs_property_name(prop);
const char *val = obs_data_get_string(settings, name);
obs_text_type type = obs_proprety_text_type(prop);
if (type == OBS_TEXT_MULTILINE) {
QPlainTextEdit *edit = new QPlainTextEdit(QT_UTF8(val));
return NewWidget(prop, edit, SIGNAL(textChanged()));
} else if (type == OBS_TEXT_PASSWORD) {
QLayout *subLayout = new QHBoxLayout();
QLineEdit *edit = new QLineEdit();
QPushButton *show = new QPushButton();
show->setText(QTStr("Show"));
show->setCheckable(true);
edit->setText(QT_UTF8(val));
edit->setEchoMode(QLineEdit::Password);
subLayout->addWidget(edit);
subLayout->addWidget(show);
WidgetInfo *info = new WidgetInfo(this, prop, edit);
connect(show, &QAbstractButton::toggled,
info, &WidgetInfo::TogglePasswordText);
connect(show, &QAbstractButton::toggled, [=](bool hide)
{
show->setText(hide ? QTStr("Hide") : QTStr("Show"));
});
children.emplace_back(info);
label = new QLabel(QT_UTF8(obs_property_description(prop)));
layout->addRow(label, subLayout);
edit->setToolTip(QT_UTF8(obs_property_long_description(prop)));
connect(edit, SIGNAL(textEdited(const QString &)),
info, SLOT(ControlChanged()));
return nullptr;
}
QLineEdit *edit = new QLineEdit();
edit->setText(QT_UTF8(val));
edit->setToolTip(QT_UTF8(obs_property_long_description(prop)));
return NewWidget(prop, edit, SIGNAL(textEdited(const QString &)));
}
当修改对应URL时会触发 void WidgetInfo::ControlChanged();
最后把数据写到settings中
void WidgetInfo::TextChanged(const char *setting)
{
obs_text_type type = obs_proprety_text_type(property);
if (type == OBS_TEXT_MULTILINE) {
QPlainTextEdit *edit = static_cast(widget);
obs_data_set_string(view->settings, setting,
QT_TO_UTF8(edit->toPlainText()));
return;
}
QLineEdit *edit = static_cast(widget);
obs_data_set_string(view->settings, setting, QT_TO_UTF8(edit->text()));
}当点击确定时 ,会触发SaveStream1Settings
void OBSBasicSettings::SaveStream1Settings()
{
QString streamType = GetComboData(ui->streamType);
obs_service_t *oldService = main->GetService();
obs_data_t *hotkeyData = obs_hotkeys_save_service(oldService);
obs_service_t *newService = obs_service_create(QT_TO_UTF8(streamType),
"default_service", streamProperties->GetSettings(),
hotkeyData);
obs_data_release(hotkeyData);
if (!newService)
return;
main->SetService(newService);
main->SaveService();
obs_service_release(newService);
}
读取现在配置的settings,创建直播service,最后再把所有的配置信息保存到本地文件中
C:\Users\Administrator\AppData\Roaming\obs-studio\basic\profiles\info\service.json
void OBSBasic::SaveService()
{
if (!service)
return;
char serviceJsonPath[512];
int ret = GetProfilePath(serviceJsonPath, sizeof(serviceJsonPath),
SERVICE_PATH);
if (ret <= 0)
return;
obs_data_t *data = obs_data_create();
obs_data_t *settings = obs_service_get_settings(service);
obs_data_set_string(data, "type", obs_service_get_type(service));
obs_data_set_obj(data, "settings", settings);
if (!obs_data_save_json_safe(data, serviceJsonPath, "tmp", "bak"))
blog(LOG_WARNING, "Failed to save service");
obs_data_release(settings);
obs_data_release(data);
} 下次程序启动时直接读取service.json