Quasar CLI with Vite - @quasar/app-vite

无边框 Electron 窗口

将 Electron 无边框窗口与 QBar 一起使用是一个不错的组合:

主进程

设置无边框窗口

首先,安装 @electron/remote 依赖。

$ yarn add @electron/remote
// or:
$ npm install @electron/remote

然后,在您的 src-electron/main-process/electron-main.js 文件中添加以下代码:

// src-electron/main-process/electron-main.js

import { app, BrowserWindow, nativeTheme } from 'electron'
import { initialize, enable } from '@electron/remote/main' // <-- 添加这里
import path from 'path'

initialize() // <-- 添加这里

// ...

mainWindow = new BrowserWindow({
  width: 1000,
  height: 600,
  useContentSize: true,
  frame: false // <-- 添加这里
  webPreferences: {
    // ...
  }
})

enable(mainWindow.webContents) // <-- 添加这里

mainWindow.loadURL(process.env.APP_URL)

// ...

注意,我们还需要手动地启用 remote 模块。我们将在预加载脚本中使用它来为渲染线程提供窗口最小化/最大化/关闭功能。

预加载脚本

由于我们不能在渲染进程中直接访问 Electron 的能力,我们需要通过预加载脚本(src-electron/main-process/electron-preload.js)来提供必要的功能,我们需要编辑它:

// src-electron/main-process/electron-preload.js

import { contextBridge } from 'electron'
import { BrowserWindow } from '@electron/remote'

contextBridge.exposeInMainWorld('myWindowAPI', {
  minimize () {
    BrowserWindow.getFocusedWindow().minimize()
  },

  toggleMaximize () {
    const win = BrowserWindow.getFocusedWindow()

    if (win.isMaximized()) {
      win.unmaximize()
    } else {
      win.maximize()
    }
  },

  close () {
    BrowserWindow.getFocusedWindow().close()
  }
})

渲染进程

处理窗口拖拽

我们使用一个无边框窗口时,我们还需要为用户提供在桌面上任意移动应用程序的能力(只有在使用无边框窗口时才需要)。您可以使用 q-electron-dragq-electron-drag--exception Quasar CSS 类来帮您。

<q-bar class="q-electron-drag">
  ...
</q-bar>

它允许用户在点击、按住鼠标来拖动应用程序窗口。

虽然这是一个很好的功能,但您还必须考虑到一些例外情况。自定义状态栏中可能有您不希望它触发窗口拖动的元素。QBtn 组件默认不会触发此拖拽行为。您可以给 q-electron-drag 的子元素添加 q-electron-drag--exception CSS 类来排除它的拖拽行为。

下面是给一个图标排除拖拽行为的示例:

<q-bar class="q-electron-drag">
  <q-icon name="map" class="q-electron-drag--exception" />

  <div>My title</div>
</q-bar>

最小化/最大化/关闭应用




在上面的示例中,我们给自定义边框添加了 q-electron-drag,同时通过预加载脚本注入了 window.myWindowAPI 对象。

// 在一个 .vue 文件中

// 我们在调用  Electron API 时做了判断,
// 这是为了我们构建其他模式时也能正常工作 (SPA/PWA/Cordova/SSR...)

export default {
  setup () {
    // we rely upon
    function minimize () {
      if (process.env.MODE === 'electron') {
        window.myWindowAPI.minimize()
      }
    }

    function toggleMaximize () {
      if (process.env.MODE === 'electron') {
        window.myWindowAPI.toggleMaximize()
      }
    }

    function closeApp () {
      if (process.env.MODE === 'electron') {
        window.myWindowAPI.close()
      }
    }

    return { minimize, toggleMaximize, closeApp }
  }
}