腾讯QQ

出自 ArchWiki
(重定向自 QQ Light)

QQ 是腾讯开发的即时通讯软件,是对 ICQ 的模仿,也是中国流行的 IM 软件。本页面列出了在 Arch Linux 上使用 QQ 的各种方案。

原生 Linux 版本

官方的 Electron 驱动的 Linux 版本已经可用。要使用它,请安装 linuxqqAUR

注意: TIM 没有官方的 Linux 版本。 如果你想使用 TIM,请使用虚拟机Wine 方案

虚拟机

你可以在虚拟机中运行完整的 Windows 系统,并在其中运行 QQ。 与其他方案相比,此方案出错的几率最小。 缺点是它占用更多资源。

提示

Wine

此条目或章节已过时。

原因: 自官方 Linux 版本发布以来,基于 Wine 的 QQ 上游已长时间未更新。 基本上由于 QQ 版本过旧而无法工作。(在Talk:Tencent QQ中讨论)

Wine 是一个“兼容层”,可以在类 UNIX 系统下运行 Microsoft Windows 程序,它可以用于模拟 QQ 环境以运行 QQ/TIM。

警告: 在平铺窗口管理器下,Wine QQ/TIM 的样式可能会大规模失控,并且需要额外配置

Deepin QQ/TIM

Deepin QQ/TIM 是 Wine 中相对成熟的解决方案。 几乎开箱即用,bug 较少。

你可以安装普通 QQ:deepin-wine-qqAUR 或 TIM: com.qq.office.deepinAUR[失效链接:未找到软件包](或从 Spark Store 安装 com.qq.tim.sparkAUR),也可以从 Arch Linux CN 源 安装普通 QQ:deepin.com.qq.im 或 TIM:deepin.com.qq.office

或者你可以安装轻聊版:deepin.com.qq.im.lightAUR

对于 KDE/Plasma 桌面,请参阅 Deepin-wine#Deepin-wine applications fails to start

Crossover

你可以使用 CrossOver 运行 QQ、TM2013 和 TIM。 更多详情请参考 CrossOver 的兼容性列表

AppImage

AppImage 是一种将应用程序打包成单个文件的格式。 你可以在 [1] 中下载打包好的 Wine QQ/TIM。 只需要赋予执行权限即可使用。 由于 AppImage 格式自带程序所需的依赖项,因此此方法受系统中其他组件版本的影响最小。

注意: 由于 AppImage 不使用系统的 Wine,因此对 Wine 的调整可能无效,例如#HiDPI 支持

青feng老师的 Wine QQ 程序

你也可以使用 青feng老师 提供的 Wine QQ 程序。

注意: 安装成功后,你需要取消勾选 QQ 的自动更新,以避免自动更新不可用。

手动 Wine 方案

QQ 轻聊版

注意: 此程序使用 QQ 轻聊版 6.7,更高版本需要在当前 wine 版本中进行额外调整才能安装。

安装 winetrickswine。 创建 qqlight.verb 如下

w_metadata qqlight apps \
 title="QQ Light" \
 publisher="Tencent" \
 year="2015" \
 media="download" \
 file1="QQ6.7Light.exe" \
 installed_exe1="$W_PROGRAMS_X86_WIN/Tencent/QQ/Bin/QQ.exe" \
 homepage="https://www.qq.com" \
 unattended="no"

load_qqlight()
{
    w_download https://dldir1.qq.com/qqfile/qq/QQ6.7Light/13466/QQ6.7Light.exe e1e1ff2bf6461c08047d0a01927a43c5a0746bdf

    if w_workaround_wine_bug 29636 "Installing native riched20 to work around crash bug"
    then
        w_call riched20
    fi

    if w_workaround_wine_bug 34566 "Installing native ctf to work around crash"
    then
        w_call msctf
    fi

    # Make sure chinese fonts are available
    w_call fakechinese

    # uses mfc42u.dll
    w_call mfc42

    cd "$W_CACHE/$W_PACKAGE"
    w_try "$WINE" "$file1"

    # fix crash after login
    mkdir -p ~/.local/share/wineprefixes/qqlight/drive_c/users/$LOGNAME/Application\ Data/Tencent/QQ/Misc/com.tencent.wireless/SDK
    chmod 000 ~/.local/share/wineprefixes/qqlight/drive_c/users/$LOGNAME/Application\ Data/Tencent/QQ/Misc/com.tencent.wireless/SDK

    w_declare_exe "$W_PROGRAMS_X86_WIN\\Tencent\\QQ\\Bin" QQ.exe
}

运行 winetricks 进行安装

$ winetricks qqlight.verb

安装完成后,通过 wineconsole 启动它

$ wineconsole .wine/drive_c/run-qqlight.bat

TIM

安装 winewine-geckowine-mono

执行 winetricks riched20,或使用 winecfg 设置函数库替换。

你可能需要配置中文字体显示,请参阅 #字体配置

安装 TIM。

生成图标

安装的 TIM 可能未在程序列表中生成图标。 要自行添加图标,请创建一个新的 tim.desktop 文件并写入以下内容

tim.desktop
[Desktop Entry]
Encoding=UTF-8
Version=1
Name=TIM
Comment=Tencent TIM
Exec=wine '~/.wine/drive_c/Program Files/Tencent/TIM/Bin/TIM.exe'
Icon=~/.wine/drive_c/Program Files/Tencent/TIM/TIMUninst.ico
Terminal=false
Type=Application
Categories=Network;

tim.desktop 移动到 ~/.local/share/applications/usr/share/applications

技巧与提示

HiDPI 支持

在 HiDPI 显示器上,QQ/TIM 界面可能太小。 较新版本的 QQ/TIM 已添加对 HiDPI 的支持。 只需手动调整 Wine 的 DPI 即可。

执行 winecfg,切换到打开窗口中的显示选项卡并调整 DPI。

注意: 如果你没有使用默认的 wine 容器(例如,使用 deepin QQ/TIM),则需要在执行 winecfg 时指定 WINEPREFIX 变量。 例如,env WINEPREFIX=$HOME/.deepinwine/Deepin-QQ deepin-wine winecfgenv WINEPREFIX=$HOME/.deepinwine/Deepin-TIM deepin-wine winecfg

平铺窗口管理器下的配置

Awesome

Wine QQ/TM 在平铺窗口管理器下可能会失控,需要进行一些配置。

以下配置具有这些效果

  • 将所有 TM 窗口设置为浮动。
  • 清除不必要的窗口边框,以防止菜单弹出时焦点移动到菜单。
  • 自动关闭弹出新闻窗口。

将以下内容添加到 Awesome 配置中

function myfocus_filter(c)
  if awful.client.focus.filter(c) then
    -- This works with tooltips and some popup-menus
    if c.class == 'Wine' and c.above == true then
      return nil
    elseif c.class == 'Wine'
      and c.type == 'dialog'
      and c.skip_taskbar == true
      and c.size_hints.max_width and c.size_hints.max_width < 160
      then
      -- for popup item menus of Photoshop CS5
      return nil
    else
      return c
    end
  end
end

awful.rules.rules = {
  -- All clients will match this rule.
  {
    rule = { },
    properties = {
      -- we use our own function
      focus = myfocus_filter,
      -- The following is the default part
      border_width = beautiful.border_width,
      border_color = beautiful.border_normal,
      keys = clientkeys,
      buttons = clientbuttons,
    }
  }, {
    rule_any = { 
      instance = {'TM.exe', 'QQ.exe'},
    },
    properties = {
      -- This, together with myfocus_filter, make the popup menus flicker taskbars less
      -- Non-focusable menus may cause TM2013preview1 to not highlight menu
      -- items on hover and crash.
      focusable = true,
      floating = true,
      -- remove the border
      border_width = 0,
    }
  }, {
    -- Other rules
  }
}

alt_switch_keys = awful.util.table.join(
    -- it's easier for a vimer to manage this than figuring out a nice way to loop and concat
    awful.key({'Mod1'}, 1, function(c) awful.util.spawn('xdotool key --window ' .. c.window .. ' ctrl+1') end),
    awful.key({'Mod1'}, 2, function(c) awful.util.spawn('xdotool key --window ' .. c.window .. ' ctrl+2') end),
    awful.key({'Mod1'}, 3, function(c) awful.util.spawn('xdotool key --window ' .. c.window .. ' ctrl+3') end),
    awful.key({'Mod1'}, 4, function(c) awful.util.spawn('xdotool key --window ' .. c.window .. ' ctrl+4') end),
    awful.key({'Mod1'}, 5, function(c) awful.util.spawn('xdotool key --window ' .. c.window .. ' ctrl+5') end),
    awful.key({'Mod1'}, 6, function(c) awful.util.spawn('xdotool key --window ' .. c.window .. ' ctrl+6') end),
    awful.key({'Mod1'}, 7, function(c) awful.util.spawn('xdotool key --window ' .. c.window .. ' ctrl+7') end),
    awful.key({'Mod1'}, 8, function(c) awful.util.spawn('xdotool key --window ' .. c.window .. ' ctrl+8') end),
    awful.key({'Mod1'}, 9, function(c) awful.util.spawn('xdotool key --window ' .. c.window .. ' ctrl+9') end)
)
function bind_alt_switch_tab_keys(client)
    client:keys(awful.util.table.join(client:keys(), alt_switch_keys))
end -- }}}

client.connect_signal("manage", function (c, startup)
  -- other configuration

  if c.instance == 'TM.exe' then
    -- add Alt+n support
    bind_alt_switch_tab_keys(c)
    -- close all kinds of news notification small windows
    if c.name and c.name:match('^腾讯') and c.above then
      c:kill()
    end
  end

  -- other configuration
end)

你也可以查看完整的 Awesome 配置

i3

在原生配置中,当 qq2012 启动时,它将自动最大化,并且边框不美观。 以下两条规则可以在 i3 config 设置中进行改进

for_window [instance="QQ.exe"] floating enable
for_window [instance="QQ.exe"] border none

故障排除

字体配置

如果你在显示中文时遇到问题,可以尝试先执行 winetricks fakechinese

另请参阅 fontsFont configuration#Applications without Fontconfig support

文件被占用

只需杀死 QQ 或 TIM 的进程即可。 退出 QQ/TIM 后,一些相关进程仍在后台运行。 你也可以使用以下脚本启动 QQ/TIM,它将首先查找现有进程,杀死该进程并启动新的 QQ/TIM。

start-tim.sh
#!/bin/sh
# script to start TIM
# kill TIM before start TIM
for pid in `pgrep TIM.exe`; do
	if [ -n ${pid} ]; then
		kill ${pid}
	fi
done
# start TIM
wine '~/.wine/drive_c/Program Files/Tencent/TIM/Bin/TIM.exe'

以上示例适用于 TIM,稍作修改后也适用于 QQ。

在 xfce4 (xfwm4) 下无法输入表情符号

打开设置管理器-窗口管理器调整-焦点,取消选中 ICCCM 焦点提示以激活焦点防盗并遵循标准。

原因是表情符号窗口获得焦点时发生不兼容。

在非中文区域设置下无法输入中文

修改 .desktop 文件的 Exec,该文件通常位于 /usr/share/applications/ 中,但必须复制到 ~/.local/share/applications/ 中以避免被覆盖。

env LC_ALL=zh_CN.UTF-8 添加到 Exec 行。 例如,原始的 Exec

Exec=".wine/drive_c/Program Files/QQ/Bin/QQ.exe"

应更改为

Exec=env LC_ALL=zh_CN.UTF-8 wine ".wine/drive_c/Program Files/QQ/Bin/QQ.exe"

使用高刷新率显示器时屏幕闪烁

请参阅 Chromium#Chromium rendering at 60 FPS despite using a display with a higher refresh rate

原生 Linux 版本的热更新

原生 Linux 版本的 QQ 有时会通知用户下载热更新。 这些更新会下载到 ~/.config/QQ/versions/,并且可以通过重启应用程序快速应用。 但是,此机制在 Arch Linux 上经常遇到问题。

热更新后出现空白登录页

如果 QQ 在热更新后显示空白登录页,请删除 ~/.config/QQ/versions/version/libssh2.so.1 并重启 QQ。 如果没有帮助,请尝试#从热更新回滚

从热更新回滚

如果你想出于任何原因从热更新版本回滚,请将当前版本添加到 ~/.config/QQ/versions/config.json 中的 onErrorVersions,并将 curVersion 更改为上次正常版本,然后重启 QQ。 下次,QQ 将使用 curVersion 中指定的版本启动,并且不会在 onErrorVersions 中询问更新。

参见