控制中心分辨率的设置功能分为几个部分,前端部分是UI,提供给用户一个良好的操作界面,后端实现部分,真正执行该功能的部分。
碰到显示模块设置不成功的或者设置后出现花屏,闪屏等问题,可以抛开控制中心快速进行问题的定位和分析。
根据Xrandr里面的wiki,首先执行xrandr命令,查看当前所连接的屏幕通用信息
执行设置分辨率的命令: xrandr --output eDP1 --mode 1920x1080 (注: eDP1 是 根据xrandr命令出来的,有可能是HDMI等等)
如果执行命令依然不成功或者花屏,闪屏,那么与控制中心无关,如果可以成功,那么需要控制中心排查一下传入参数是否正确
这里以我实际开发碰到的问题为例子:当打开控制中心以后,点击账户模块,提示如下错误:
GLib-GIO-ERROR **: 16:11:19.644: Settings schema 'com.deepin.dde.control-center' does not contain a key named 'auto-login-visable'
追踪与中断点陷阱 (核心已转储)
问题原因: 对应的 com.deepin.dde.control-center.gschema.xml 文件找不到 'auto-login-visable' 这个节点信息
分析过程: 控制中心程序可以启动,但是当点击“账户”模块时,控制中心就崩溃掉了。 可以在控制台下执行 dde-control-center -s , 等界面出来后,点击
“账户”模块,然后控制中心程序退出,控制台可以看到标题内容错误。
解决办法: 这个错误通常会出现在新功能开发阶段,不像dde-dock ,控制中心的 com.deepin.dde.control-center.gschema.xml 并非自己的工程进行管理,它
是另外一个项目——deepin-desktop-schemas 它来管理的。这个时候我们需要下载 deepin-desktop-schemas 工程并切换到对应的分支,然后将对应的xml文件
拷贝到 /usr/share/glib-2.0/schemas 目录下(有则覆盖)
问题原因:闪退的原因有很多,这里之举例启动的一种情况,也是大家很容易遇到的情况,dde-qt-dbus-factory的版本没有和dde-control-conter的版本同步升级,这个特别容易出现在exp版本,有些之更新了 dde-control-conter其他的控制中心依赖的没有更新导致的
分析过程:可以在命令行中打开控制中心即在终端输入: dde-control-conter -s 看下报错误的位置比如xxx::datetime xxxx::battery 等等
解决办法:更新dde-qt-dbus-factory和dde-control-conter到最新的版本
问题原因:1.没有输入输出硬件设备,2.没有接入对应的输入输出设备。
分析过程:1.使用命令“arecord -l”查看音频输入设备,使用命令“aplay -l”查看音频输出设备,查看有无输入输出硬件设备。2.安装并打开D-Feet,选择Session Bus。在左侧搜索com.deepin.daemon.Audio,在右侧依次展开/com/deepin/daemon/Audio->Interfaces->com.deepin.daemon.Audio->Properties。双击Cards查看所有输入输出端口,属性Direction=1表示输出端口,Direction=2表示输入端口。双击DefaultSink查看选中端口所属输出设备,双击DefaultSource查看选中端口所属输入设备。双击Sinks查看输出设备列表,双击Sources查看输入设备列表。设定DefaultSink为/com/deepin/daemon/Audio/Sink0,依次展开/com/deepin/daemon/Audio/Sink0->Interfaces->com.deepin.daemon.Audio.Sink->Properties,双击ActivePort查看选中端口,双击Card查看端口CardID。设定DefaultSource为/com/deepin/daemon/Audio/Source0,依次展开/com/deepin/daemon/Audio/Source0->Interfaces->com.deepin.daemon.Audio.Source->Properties,双击ActivePort查看选中端口,双击Card查看端口CardID。
###"控制中心-账户"无指纹相关信息
问题原因: 1.未接入指纹设备,2.已接入指纹设备,但系统未识别,3.指纹设备硬件已损坏
分析过程:1.首先需要了解系统版本系统是否支持指纹识别。支持指纹设备后,可进一步排查问题出现原因。2.当未接入指纹设备时,“控制中心-账户”中不会有指纹相关信息及“添加指纹”按钮,需先接入指纹设备,3.接入设备后若还是没有指纹相关信息,打开D-Feet工具,左侧搜索系统服务“com.deepin.daemon.Authenticate”,进入“/com/deepin/daemon/Authenticate/Fingerprint”路径下“com.deepin.daemon.Authenticate.Fingerprint”接口中,查看“Devices”属性是否有值,若为空,则表示系统为识别出来,需要先重启电脑后再查看,4.重启后若还是没有指纹信息,此时可更换usb端口后重新查看。5.若更换端口后D-Feet中还是无法查看到指纹设备信息,此时无法判定是否指纹设备硬件是否已损坏。6.更换电脑,多试几次,若还是找不到指纹账户信息。则可以判定指纹设备已损坏。
###选中打开文件的默认程序
问题原因:没有选中的默认程序,默认程序勾选错误。
分析过程:安装并打开D-Feet,选择Session Bus。在左侧搜索com.deepin.daemon.Mime,在右侧依次展开/com/deepin/daemon/Mime->Interfaces->com.deepin.daemon.Mime->Methods。网页类型:"x-scheme-handler/http","x-scheme-handler/ftp","x-scheme-handler/https","text/html","text/xml","text/xhtml_xml","text/xhtml+xml"。邮件类型:"x-scheme-handler/mailto","message/rfc822","application/x-extension-eml","application/x-xpinstall"。文本类型:"text/plain"。音乐类型:"audio/mpeg","audio/mp3","audio/x-mp3","audio/mpeg3","audio/x-mpeg-3","audio/x-mpeg","audio/flac","audio/x-flac","application/x-flac","audio/ape","audio/x-ape","application/x-ape","audio/ogg","audio/x-ogg","audio/musepack","application/musepack","audio/x-musepack","application/x-musepack","audio/mpc","audio/x-mpc","audio/vorbis","audio/x-vorbis","audio/x-wav","audio/x-ms-wma"。视频类型:"video/mp4","audio/mp4","audio/x-matroska","video/x-matroska","application/x-matroska","video/avi","video/msvideo","video/x-msvideo","video/ogg","application/ogg","application/x-ogg","video/3gpp","video/3gpp2","video/flv","video/x-flv","video/x-flic","video/mpeg","video/x-mpeg","video/x-ogm","application/x-shockwave-flash","video/x-theora","video/quicktime","video/x-ms-asf","application/vnd.rn-realmedia","video/x-ms-wmv"。图片类型:"image/jpeg","image/pjpeg","image/bmp","image/x-bmp","image/png","image/x-png","image/tiff","image/svg+xml","image/x-xbitmap","image/gif","image/x-xpixmap","image/vnd.microsoft.icon"。终端类型:"application/x-terminal"。双击GetDefaultApp,弹出运行D-Bus方法,在方法输入框中输入音乐类型的任意一种比如"audio/mpeg",点击运行,方法输出框中展示错误信息或者输出当前类型的默认程序。类似操作执行ListApps查看对应类型所有应用程序,执行ListUserApps查看用户自定义添加的应用程序。
解决办法:查看对应类型的默认程序
###查看帐户是否在线
问题原因:不能移除在线帐户。
分析过程:安装并打开D-Feet,选择System Bus。在左侧搜索com.deepin.daemon.Accounts,在右侧依次展开/com/deepin/daemon/Accounts->Interfaces->com.deepin.daemon.Accounts->Properties。双击UserList查看所有帐户,设定帐户为/com/deepin/daemon/Accounts/User1000,依次展开/com/deepin/daemon/Accounts/User1000->Interfaces->com.deepin.daemon.Accounts.User->Properties,双击UserName查看帐户名称,类似查看其它信息。在左侧搜索org.freedesktop.DisplayManager,再右侧依次展开/org/freedesktop/DisplayManager->Interfaces->org.freedesktop.DisplayManager->Properties。双击Sessions查看所有在线会话,设定在线会话为/org/freedesktop/DisplayManager/Session1,依次展开/org/freedesktop/DisplayManager/Session1->Interfaces->org.freedesktop.DisplayManager.Session->Properties,双击UserName查看在线会话对应的帐户名称。
解决办法:查看所有帐户及在线帐户
###控制中心无法启动、某个模块进入就闪退
问题原因:dbus接口版本与控制中心版本不匹配+gesetting配置文件版本不匹配+代码逻辑问题(空指针、除零)。前两个为项目项目特性强关联的常见崩溃原因。
分析过程:dbus版本问题--命令启动控制中心,查看输出报错信息,有类似symbol error,undefine symbol的字样,还会有一个运行函数名(和源码函数名有一定差异,熟悉接口大概可以看出对应代码函数名),这种状况根据控制中心版本去crp下载对应较新的dde-qt-dbus-factory版本安装可解。
gsetting版本问题--命令启动控制中心,查看输出报错信息,有GLib-GIO-ERROR,Settings schema字样的报错,信息里描述了缺少哪个schema或者哪个字段,同样根据控制中心版本去crp下载对应较新deepin-desktop-schemas版本安装。另外也可以到gerrit下载代码上库编译出的包或者自己更新代码编译一个版本,这两种方法也适合第一类问题。
代码逻辑导致崩溃--启动或进入就崩溃的代码逻辑问题,直接到对应模块的preInitialize(bool sync)、initialize()、active()、load(const QString &path)查看,崩溃就出在这几个函数中,可以加快定位崩溃代码点。
控制中心命令启动:启动控制中心主界面 dde-control-center -s 启动指定模块 dde-control-center -m moduleName 启动指定模块页面 dde-control-center -m moduleName -p pageName
模块名列表:"accounts" "cloudsync" "display" "defapp" "personalization" "network" "notification" "sound" "bluetooth" "datetime" "power" "mouse" "wacom" "keyboard" "update" "systeminfo" "commoninfo"
页面名繁多,不一一列举。
###各部件窗口滚动条位置问题
问题原因1:按住鼠标左键拖动滚动条,结果窗口部件移动方向与鼠标方向相反;
分析过程:鼠标左键按下拖动,属于就是一个手指在屏幕上沿着一个固定的方向滑动,滑动一段距离时就产生了一个事件,这时需要调用QWidget::grabGesture方法来截获相应的手势类型。此时可以查看这个函数的声明,有2个重载函数:
static Qt::GestureType grabGesture(QObject *target, ScrollerGestureType gestureType = TouchGesture);
static Qt::GestureType grabbedGesture(QObject *target);
第一个函数声明不仅定义了滑动手势目标对象还定义了滑动姿势。现在基本可以确定是滑动目标对象有问题导致QScroller::LeftMouseButtonGesture这个滑动姿势出现的现象不是期望的。
问题原因2:各窗口部件的滚动条遮挡listview控件内容;
分析过程:DTK提供的滚动条控件,但是他们只保证滚动条离滚动区域2像素,我们自己需要手动去添加,移动滚动条的位置通常在listview,即滚动条要滚动的区域加setContentsMargins(0, 0, 0, 0); setViewportMargins(12, 0, 12, 0);这个12像素可根据情况自行调整。为什么要调这个可参考https://blog.csdn.net/hyongilfmmm/article/details/83014405很详细的讲解了Qt滚动区域原理(QAbstractScrollArea)。
###自定义模式下点击旋转屏幕未保存,屏幕由拆分变成合并
问题原因是执行DisplayWorker的setMonitorRotate会导致monitor参数变化, worker会发信号通知model数据变了,这个过程是一个异步,CustomSettingDialog重新应用屏幕位置时, 有可能出现model数据没有获取对CustomSettingDialog判断屏幕的宽高不一致,就给设定为了拆分模式,在setMonitorRotate加一个m_model->isMerge() == false判断就好了。