Tencent QQ (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

QQ 是腾讯公司开发的即时通讯软件,为 ICQ 的仿制品,是中国最流行的 IM 软件。本页面列出了 Arch Linux 使用 QQ 的各种解决方案。

官方版本

官方版本已经可用。要使用官方版本,安装 linuxqqAUR

注意: 官方版本提供的是普通 QQ,TIM 没有官方版本。如果要使用 TIM,请使用 wine 方案
注意: 官方版本功能不全,界面简陋,如果需要使用缺失的功能或更好看的界面,请使用 wine 方案

9.3.9的强制更新会导致wine-qq自动更新。

虚拟机

您可以在虚拟机中运行一个完整的 Windows 系统,并在此中运行 QQ。相比于其他的方案,这种方案出错的几率是最小的,缺点是占用的资源较多。

提示:
  • 根据许可条款,在每个虚拟设备上运行 Windows 都需要单独的授权。但您可以选择使用微软提供的虚拟机专用系统(免费使用)。
  • 如果您使用 VirtualBox,建议您开启无缝模式,这个功能能让您在宿主机的桌面下无缝操作虚拟机中的窗口。

Wine

Wine 是类 UNIX 系统下运行微软 Windows 程序的"兼容层",可以用它模拟 Windows 环境来运行 QQ/TIM。

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

Deepin QQ/TIM

Deepin QQ/TIM 是 wine 中相对成熟的方案。几乎开箱即用,bug 较少。可从AUR(可以选择 ArchLinux CN 源)安装:

普通 QQ:com.qq.im.deepinAUR

TIM:com.qq.office.deepinAUR ,若想使用较新的可选: com.qq.tim.sparkAURdeepin-wine-timAUR

或者可以安装 Light 版:deepin.com.qq.im.lightAUR

如果是 KDE/Plasma 桌面,见 Deepin-wine#Deepin-wine applications fails to start

如果是 N 卡用户,可能需要用安装 lib32-nvidia-utils 才能使用。

Crossover

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

AppImage

AppImage 是一种把应用打包成单一文件的格式。您可以在sourceforge下载到封装好的 Wine QQ/TIM。只需要赋予可执行权限即可使用。由于 AppImage 格式附带了程序所需要的依赖,所以这种方式受系统中其他组件版本的影响最小。

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

清风老师的 Wine QQ 方案

您也可以使用清风老师提供的 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文件夹下即可。

第三方客户端

注意: 请尽量使用含 wine 客户端在内的代码来自腾讯官方的客户端。第三方客户端尽管不存在官方客户端的一系列问题,但随时可能因为种种原因而失效。

vscode-qq

vscode-qq 是一款 vscode 插件,让用户可以在 vscode 里使用基本的 qq 功能。

Icalingua

Icalingua 包含一个使用 electron 和 vue 编写的第三方 qq 客户端,当前处于活跃开发状态。支持使用 SQLite(内置)、 MySQL(含 MariaDB)、 PostgreSQLMongoDBRedis 存储聊天记录。功能较官方版本更多,也没有 wine 带来的一系列问题。要使用 Icalingua,可安装 icalinguaAUR 包。

提示与技巧

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 winecfg 或是 env 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 = {
      -- 这里使用我们自己的函数
      focus = myfocus_filter,
      -- 以下是默认的部分
      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,
      -- 去掉边框
      border_width = 0,
    }
  }, {
    -- 其它规则
  }
}

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)
  -- 其它配置

  if c.instance == 'TM.exe' then
    -- 添加 Alt+n 支持
    bind_alt_switch_tab_keys(c)
    -- 关闭各类新闻通知小窗口
    if c.name and c.name:match('^腾讯') and c.above then
      c:kill()
    end
  end

  -- 其它配置
end)

也可以看看完整 Awesome 配置

i3

原生配置下,启动 qq2012 时会自动最大化,且边框不美观,可在 i3config 设置如下两条规则以改善:

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

疑难解答

无法调用输入法

如果在 QQ 中使用输入法无反应,可考虑在 QQ 的启动脚本中配置有关环境变量,示例如下(将 fcitx 改成你用的输入法)。

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

com.qq.im.deepinAUR等默认脚本中可能存在将输入法配置为 ibus 的行,如果你要使用其它输入法,需将这些行删去。

字体配置

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

另请参阅字体没有 fontconfig 支持的应用程序

文件被占用

杀死 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 焦点提示即可。

原因是表情窗口获取焦点时会发生不兼容现象。

在非中文 locale 下无法输入中文

修改 .desktop 文件的 Exec,这个文件一般位于 /usr/share/applications/ 或者 ~/.local/share/applications/

Exec 行中加入 env LC_ALL=zh_CN.UTF-8。 例如,原来的 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"

deepinwine方案在非中文 locale 下字体显示为黑框且能够调用输入法但是无法输入字符

首先查看是否安装有中文locale。在 /etc/locale.gen 中启用zh_CN.UTF-8 UTF-8(删除#符号)。而后运行命令 locale-gen

安装了中文locale后,修改deepinwine的启动脚本,其位于 /opt/deepinwine/tools/ 。其中有三个脚本,分别为 run.shrun_v2.shrun_v3.sh。将三个脚本中的

WINE_CMD="deepin-wine"

都修改为

WINE_CMD="LC_ALL=zh_CN.UTF-8 deepinwine"。

也可以根据对应deepinwine容器的启动脚本(一般路径为 /usr/share/applications/*.desktop )中的Exec行确定要修改的脚本。

参阅