Ncurses 和 Qt 互操作性

2024-04-21

拥有基于 Qt 和 ncurses 的应用程序,在等待用户输入时每秒刷新屏幕的最佳方法是什么? (例如显示时钟并获取用户输入)。

我需要 CPU 使用率和应用程序响应能力之间的最佳折衷。

更具体地说,如何获取用户输入并仍然使用QTimer以及信号槽机制?

使用下面的代码时,计时器不起作用。

nodelay(stdscr,true); while(1) { sleep(1); getch(); processInput(); }

  1. Use QSocketNotifier收到可用信息的通知stdin.

  2. 呼叫非阻塞getch()循环直到没有更多输入可用。这一点非常重要:通知者只有在以下情况下才会通知new数据可用,但这并不意味着它会通知每个字符!如果您一次收到多个字符,您通常只会收到一个通知 - 因此您必须继续发出非阻塞通知getch()直到它返回ERR这意味着目前没有更多数据可用。

  3. 您还应该读取在连接套接字通知程序之前可用的所有数据。

The code below echoes the input as it receives it, and additionally outputs a * every second. This works on Linux and OS X, and is not portable to Windows. To quit, press Q.

Using ncurses对于传统的文本模式用户界面(如果需要),同时利用 Qt 处理其他一切(计时、网络、具有基于文本的视图的数据模型、XML、QObjects 等)是一种完全有效的方法。

// https://github.com/KubaO/stackoverflown/tree/master/questions/ncurses-20606318
#include <QtCore>
#include <ncurses.h>

class Worker : public QObject
{
   Q_OBJECT
   QSocketNotifier m_notifier{0, QSocketNotifier::Read, this};
   QBasicTimer m_timer;
   Q_SLOT void readyRead() {
      // It's OK to call this with no data available to be read.
      int c;
      while ((c = getch()) != ERR) {
         printw("%c", (char)(c <= 255 ? c : '?'));
         if (c == 'q' || c == 'Q') qApp->quit();
      }
   }
   void timerEvent(QTimerEvent * ev) {
      if (ev->timerId() != m_timer.timerId()) return;
      printw("*");
      refresh();
   }
public:
   Worker(QObject * parent = 0) : QObject(parent) {
      connect(&m_notifier, SIGNAL(activated(int)), SLOT(readyRead()));
      readyRead(); // data might be already available without notification
      m_timer.start(1000, this);
   }
};

int main(int argc, char *argv[])
{
   QCoreApplication a{argc, argv};
   Worker w;
   auto win = initscr();
   clear();
   cbreak(); // all input is available immediately
   noecho(); // no echo
   printw("Press <q> to quit\n");
   keypad(win, true); // special keys are interpreted and returned as single int from getch()
   nodelay(win, true); // getch() is a non-blocking call
   auto rc = a.exec();
   endwin();
   return rc;
}

#include "main.moc"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ncurses 和 Qt 互操作性 的相关文章

  • __libc_start_main 发生了什么?

    我真的很想理解从高级代码到可执行文件的步骤 但是遇到了一些困难 我写了一个空的int main C 文件并尝试通过以下方式破译反汇编objdump d 这是发生的事情 in start 设置对齐方式 将参数压入堆栈 调用 libc star
  • C# 中的 DateTime.Parse 抛出异常

    我不知道为什么抛出异常 这是工作代码 DateTime Parse 1 12 2012 12 00 00 AM 这是抛出异常的一个 DateTime Parse 1 13 2012 12 00 00 AM 抛出的异常是 格式异常 包括此消息
  • 仅使用 1 行 C++ 初始化 2d 向量

    我需要能够初始化一个 2D 向量 int同一条线我在其中创建它 更具体地说 我必须创建一个3x2大小 2D 向量并将其所有值设置为 0 仅使用1行代码 有没有一种方法可以在不使用 for 循环和几行代码的情况下完成此操作 尝试这个 std
  • clang-tidy - 忽略第三方标头代码

    我正在为我的项目使用 CMake 并且我想向项目引入 clang tidy 检查 我用于此目的CMAKE CXX CLANG TIDY and clang tidy用于检查设置的文件 我想在 CI 中使用警告作为错误来可靠地检查提交是否引入
  • 从 proc/pid/cmdline 解析命令行参数

    我正在尝试解析命令行参数另一个程序 这是一个模拟器 在我的程序中使用system 命令和模拟器的pid 不幸的是同时使用文件读取和cat 输出格式不正确 所以我无法真正获取数据 cat在命令行上显示删除了空格的文件内容 整个字符串粘在一起
  • 将文件扩展名与应用程序关联

    我编写了一个编辑特定文件类型的程序 我想为用户提供在启动时将我的应用程序设置为该文件类型的默认编辑器的选项 因为我不需要安装程序 我尝试编写一个可重用的方法 通过向 HKEY CLASSES ROOT 添加一个键来为我关联一个文件 最好在任
  • float.Parse 不再在 Unity 中工作 (C#)

    我有一个包含以下代码行的工作项目 public InputField mass float val float Parse mass text 非常简单 用户输入一定量的质量 然后将其从文本解析为浮动 几天前这工作得很好 我什至能够多次导出
  • 可空引用类型意外 CS8629 可空值类型对于临时变量可能为空

    在 C 8 项目中 我使用可为 null 的引用类型 并收到意外的 或者至少对我来说意外的 CS8629 警告 bool singleContent x DataInt null bool multiContent x DataNvarch
  • ASP.NET Core 测试 - 没有方法 'public static IHostBuilder CreateHostBuilder(string[] args)

    我正在尝试在测试中设置我的应用程序并在中使用Startup s Configure method context Database EnsureCreated 并期待着Sqlite文件出现在Test sbin文件夹 这是我的代码 using
  • “上下文模式”的这种实现看起来不错吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有多个处理单元可能存在于一个数组中 每个处理单元都有自己的参数 我想使用以下方式传达每个处理单元的参数上下文模式在它被建议作为另一个问题的解答 ht
  • g++.exe 和 x86_64-w64-mingw32-g++.exe 有什么区别?

    同样的问题也适用于 gcc ar 等 在 Code Blocks 中将工具链可执行文件从 Something exe 更改为 x86 64 w64 mingw32 something exe 时 代码仍然可以完美编译 此外 32 位和 64
  • 将迭代器取消引用到临时范围时出现非指针操作数错误

    Using auto empty line auto str return str size 0 我们做得到 auto line range with first non empty ranges view drop while range
  • 在 C 中初始化结构体的静态数组

    我正在用 C 实现一个纸牌游戏 纸牌有很多种类型 每种纸牌都有大量信息 包括一些需要单独编写与其关联的脚本的操作 给定这样的结构 并且我不确定我的语法是否适合函数指针 struct CARD int value int cost This
  • 在javascript中调用c#函数[重复]

    这个问题在这里已经有答案了 可能的重复 从 Javascript 调用 ASP NET 函数 https stackoverflow com questions 3713 call asp net function from javascr
  • 列表框显示类名称而不是值

    我正在开发一个项目 其中用户应该向动物输入值 名称 年龄 性别等 并且用户输入的值应该显示在列表框中 这些类相互继承 以下是继承的工作原理 Animalclass 是所有类的父类 Mammal类继承自Animal class Dog类继承自
  • ASP.NET 5 (vNext) - 配置

    我正在尝试学习 ASP NET 5 我在 Mac OS X 上使用它 此时 我有一个如下所示的 config json 文件 配置 json AppSettings Environment dev DbSettings AppConnect
  • C# - 使用 Linq 获取 Attribute 的属性

    我有一个属性 它本身就有属性 我想访问这些属性之一 布尔值 并检查它是否正确 我能够检查属性是否已设置 但这就是全部 至少对于 linq 来说是这样 属性 public class ImportParameter System Attrib
  • 在 Qt C++ 中使用多个键

    我正在构建 坦克 游戏 我使用关键事件在地图上运行我的坦克 实际上我当时只能使用一把钥匙 但我需要有能力去完成任务 同时向上和离开 这是我的单键事件代码 switch event gt key case Qt Key Up if ui gt
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调
  • C# 泛型中的通配符等效项

    假设我有一个通用类 如下所示 public class GeneralPropertyMap

随机推荐

  • 如何从WebBrowser控件获取图像

    我有一个 WebBrowser 控件 在浏览页面后我需要下载图像 我使用了以下代码 HtmlElementCollection tagsColl webBrowser1 Document GetElementsByTagName img f
  • SQL插入相关表

    在我看来 这似乎是 SQL 数据库开发中经常出现的问题 但我对这一切都是新手 所以请原谅我的无知 我有 2 张桌子 CREATE TABLE dbo Tracks TrackStringId bigint NOT NULL Id bigin
  • 如何从 Node.js 调用 C++ 代码?

    我目前正在开发一个在服务器上运行的模拟器 并应在浏览器中显示数据 对于服务文件 通信和类似的事情 我想使用 Node js 但是 我不确定它在计算部门是否会像我希望的那样执行 所以我想用 C 开发模拟部分 模拟被划分为单独的 世界 它们都以
  • 使用 node-sass 安装 angular-cli 时出错

    我的系统配置 Debian 4 4 nvm 0 33 8 节点 v8 9 4 npm 5 6 0 我想安装 Angular clinpm install g angular cli 但我收到一条错误消息 root contracts hom
  • NugGet Semver - 允许哪些预发行角色?

    我正在尝试对我的 NuGet 包 NET Core 2 之一使用语义版本控制 版本如下 1 0 0 my fancy branch 123 正如您所猜测的 我尝试将分支名称和当前 BuildId 设置为预发布标签 不幸的是 dotnet b
  • MediaCodec.createInputSurface() 在 Android 模拟器中抛出 IllegalStateException(错误 -38)

    I have MediaMuxer MediaMuxer mMediaMuxer new MediaMuxer new File Environment getExternalStorageDirectory video mp4 getPa
  • 在 Shiny 中格式化响应式 data.frames

    我有一个工作闪亮的应用程序 但我正在更改它 以便输入数据是反应性的 当底层数据更新时它会更新 当它刚刚读入数据时 它工作得很好 但现在数据是反应性的 我在其中一个文件上遇到了问题 另外两个文件按预期工作 该文件是从数据库导出的 csv 我想
  • 数据库级别的国际化

    谁能向我指出一些解决数据库级别任务国际化的模式 最简单的方法是为每个文本列的每种语言添加一个文本列 但这在某种程度上有点难闻 我真的希望能够动态添加支持的语言 我要提出的解决方案是保存在模型中的一种主要语言和一个查询翻译并将翻译保存到的字典
  • 为什么unique_ptr::~unique_ptr需要T的定义?

    如果我有一堂 酒吧 课 bar h class Bar public Bar 我转发声明与另一个类 Foo 中的 std unique ptr 一起使用 foo h include
  • Visual Studio 2010 - 如何优化

    我正在使用 2010 版的 Visual Studio 但遇到了许多延迟问题 我的计算机具有良好的 RAM 和处理器配置 特别是在保存文件时 目前 我正在进行一个中型项目 只有一个打开文件 ASP NET 页面 使用第三方 Telerik
  • ActionBarSherlock - 无法解析类型 android.support.v4.app.Fragment。它是从所需的 .class 文件间接引用的

    我使用 ActionBarSherlock 作为一个项目中的库项目 该项目本身就是一个库 一切都工作正常 直到我将项目移至新计算机并更新了 SDK 工具 我有这个错误我不明白 当我创建一个扩展 SherlockFragment 的类时 如下
  • xCode Instruments 检测到的这些内存泄漏对象是什么?

    我有一个 iPhone 应用程序 似乎存在内存泄漏问题 这是一款益智游戏 在玩了几个谜题后 应用程序在设备上崩溃了 我现在尝试使用 xcode Instruments 来检测发生了什么 第一次使用仪器 我注意到 泄漏 图中有一个泄漏栏 就在
  • JTextField 中的下拉列表

    我不知道当我在文本字段中输入一些字母时 应该从我的数据库中选取相关项目并应显示为下拉列表 例如 我在文本字段中输入了 J 在我的数据库中具有诸如 Juby Jaz Jasmine Joggy 之类的名称 这些名称应显示为列表 这样我就可以从
  • MSChart 中系列和数据点的所有可用自定义属性的最终列表

    我正在使用 NET 3 5 MSChart 控件 有时我发现我需要向系列或数据点添加自定义属性 例如 Series series new Series series PieDrawingStyle SoftEdge DataPoint po
  • Graphql 没有为接口/联合定义解析器 - java

    我在使用这种方法添加解析器时遇到问题graphql RestController RequestMapping api dictionary RequiredArgsConstructor onConstructor Autowired p
  • C# 中是否有与 HashSet 等效的 AddRange

    通过列表 您可以执行以下操作 list AddRange otherCollection a 中没有添加范围方法HashSet 添加另一个的最佳方法是什么ICollection to a HashSet For HashSet
  • MySQL中如何获取两个值中的最大值?

    我尝试过但失败了 mysql gt select max 1 0 ERROR 1064 42000 You have an error in your SQL syntax check the manual that corresponds
  • twitter bootstrap 下拉菜单的对齐

    我设计了一个带有下拉菜单的引导导航栏 http jsfiddle net yabasha fex8N 3 http jsfiddle net yabasha fex8N 3
  • Android活动内存消耗

    我有一个 Android 应用程序 有 4 个活动 第一个是基本的启动屏幕 第二个是登录 第三个是主屏幕 第四个是用于绘图的额外屏幕 在真实设备上运行该应用程序 2014 年的 Samsung Galazy 选项卡或 Android 4 4
  • Ncurses 和 Qt 互操作性

    拥有基于 Qt 和 ncurses 的应用程序 在等待用户输入时每秒刷新屏幕的最佳方法是什么 例如显示时钟并获取用户输入 我需要 CPU 使用率和应用程序响应能力之间的最佳折衷 更具体地说 如何获取用户输入并仍然使用QTimer以及信号槽机