如何使用 QML 更改系统日期和时间(嵌入式 Linux)?

Posted

技术标签:

【中文标题】如何使用 QML 更改系统日期和时间(嵌入式 Linux)?【英文标题】:How to change system date and time(embedded Linux) using QML? 【发布时间】:2018-01-05 06:11:30 【问题描述】:

如何在 QML 中更改系统时间和日期?我认为这可能从一个例子中起作用,尽管我怀疑对象被发送到哪里。它没有用。有人可以告诉我怎么做吗?以下是我的代码:

  var time = new Date()
  time.setHours(hour)
  time.setMinutes(minute)
  time.setSeconds(secs)

【问题讨论】:

闻起来很像XY problem。请编辑您的问题以改进它并给出真正的动机和背景。你有什么样的应用程序?如果您开发一些嵌入式系统,请说出并解释它是什么系统...... 【参考方案1】:

没有root权限一般是不能更改系统时间的,设置系统时间是系统管理员的全系统操作。请参阅 settimeofday(2) 和 adjtimex(2)。另见credentials(7) & capabilities(7)。

(所以这不是使用Qt或其他东西的问题;任何使用settimeofdayadjtimex的库都需要root权限)

另请阅读time(7)。

而且你一般不应该改变系统时间,而是让一些守护进程使用NTP不断调整它。

你的代码只是改变了一些持有一段时间的变量的值。它不会改变系统时间。

系统管理员可以更改时间,例如date(1) 与 -s 一起使用,这需要 root 权限并在内部使用 settimeofday。另见hwclock(8)。

请注意,GUI 应用程序通常不应以 root 身份运行(Qt 或 GTK 也不希望以 root 身份运行)。

如果您开发一些嵌入式系统并且希望用户设置时间,您可以考虑编写一些 small 专用的 setuid 可执行文件,它使用 settimeofday(2) 并让您的 GUI 应用程序运行它(例如QProcess)。在编写 setuid 程序时要非常小心(所以请阅读 ALP 或一些关于 Linux 系统编程的好书),因为您很容易得到 vulnerabilities。请注意,setuid 是获取获取或更改权限。它使用起来很棘手,所以请花时间去理解它。

也许您的initsystemd 可能被配置为简化这样的任务......

(您需要更多地描述您的整个系统以获得更多帮助)

【讨论】:

那用户怎么改呢?我正在 IMX6 平台上工作。 用户不应更改它。你应该有一些使用 NTP 的守护进程。并且系统管理员可以更改它(例如,通过运行,作为 rootdate -s)。 这是一个用户特定的应用程序,我不能在这里完全解释它(对此感到抱歉)。但是每部手机和 PC 都可以选择更改日期和时间,就像我可以让用户选择更改日期和时间一样,如果他/她想更改的话。如何在 QML/javascript 中做到这一点? 按照我的建议,编写您的专用 setuid 程序,然后从您的 Qt 应用程序中运行它。如果你不能解释你的申请,你不应该在 SO 上提问。 顺便说一句,这主要是整个系统和系统管理员的问题。您的系统是否正在运行 systemd ?或者什么样的init程序?

以上是关于如何使用 QML 更改系统日期和时间(嵌入式 Linux)?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过远程更改 qml 文件来更新 Qml Android 应用程序

如何更改 django 日期时间格式输出?

动态且单独更改 QML TableView Element 行高

如何在 QML 中从 QString 格式化日期

如何将 QML 视图嵌入到本机窗口中

如何有条件地禁用 QML 绑定到 C++ 后端?