pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

Ncurses 和 Qt 互操作性

Ncurses and Qt Interoperability(Ncurses 和 Qt 互操作性)
本文介紹了Ncurses 和 Qt 互操作性的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

有一個基于 Qt 和 ncurses 的應用程序,在等待用戶輸入時每秒刷新屏幕的最佳方法是什么?(例如,顯示時鐘并獲取用戶輸入).

Having a Qt and ncurses based application, what is the best way to refresh the screen every second, while waiting for user input? (e.g. show the clock and get user input).

我需要在 CPU 使用率和應用程序響應能力之間取得最佳折衷.

I need the best compromise between CPU usage and application responsiveness.

更具體地說,如何獲取用戶輸入并仍然使用 QTimer 和信號槽機制?

To be more specific with the question, how to get user input and still use QTimer and the signal-slot mechanism?

使用下面的代碼時,定時器不起作用.

When using the code below, the timers doen't work.

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

推薦答案

  1. 使用 QSocketNotifier 來通知 stdin 上可用的東西.

  1. Use QSocketNotifier to be notified of things being available on stdin.

在循環中調用非阻塞 getch() 直到沒有更多輸入可用.這一點非常重要:只有當數據可用時,通知程序才會通知,但這并不意味著它會通知每個字符!如果您一次收到多個字符,您通常只會收到一個通知 - 因此您必須繼續發出非阻塞 getch() 直到它返回 ERR 意味著沒有更多數據目前可用.

Call nonblocking getch() in a loop until no more input is available. This is vitally important: the notifier will notify only when new data is available, but this doesn't mean that it notifies on every character! If you receive multiple characters at a time, you will usually get just one notification - thus you must keep issuing non-blocking getch() until it returns ERR meaning that no more data is available at the moment.

您還應該讀取在連接套接字通知程序之前可用的所有數據.

You should also read all of the data that became available in the time before the socket notifier became attached.

下面的代碼在接收到輸入時回顯,并且每秒額外輸出一個 *.這適用于 Linux 和 OS X,不能移植到 Windows.要退出,請按 Q.

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.

在需要時將 ncurses 用于傳統文本模式用戶界面,同時將 Qt 用于其他所有方面(計時、網絡、具有基于文本的視圖的數據模型、XML、QObjects 等)是一種完全有效的方法.

Using ncurses for a legacy text-mode user interface, where desired, while leveraging Qt for everything else (timing, networking, data models with text-based views, XML, QObjects, etc.) is a perfectly valid approach.

// 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
");
   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"

這篇關于Ncurses 和 Qt 互操作性的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數據?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫 for() 循環: for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環?)
Reusing thread in loop c++(在循環 C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環形?)
主站蜘蛛池模板: 专业生物有机肥造粒机,粉状有机肥生产线,槽式翻堆机厂家-郑州华之强重工科技有限公司 | 顺景erp系统_erp软件_erp软件系统_企业erp管理系统-广东顺景软件科技有限公司 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 郑州墨香品牌设计公司|品牌全案VI设计公司 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 探伤仪,漆膜厚度测试仪,轮胎花纹深度尺厂家-淄博创宇电子 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | Jaeaiot捷易科技-英伟达AI显卡模组/GPU整机服务器供应商 | 科威信洗净科技,碳氢清洗机,超声波清洗机,真空碳氢清洗机 | 废气处理_废气处理设备_工业废气处理_江苏龙泰环保设备制造有限公司 | 北京亦庄厂房出租_经开区产业园招商信息平台 | 河南道路标志牌_交通路标牌_交通标志牌厂家-郑州路畅交通 | 隧道风机_DWEX边墙风机_SDS射流风机-绍兴市上虞科瑞风机有限公司 | 整合营销推广|营销网络推广公司|石家庄网站优化推广公司|智营销 好物生环保网、环保论坛 - 环保人的学习交流平台 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 猎头招聘_深圳猎头公司_知名猎头公司| 过跨车_过跨电瓶车_过跨转运车_横移电动平车_厂区转运车_无轨转运车 | 黑田精工电磁阀-CAMMOZI气缸-ROSS电磁-上海茂硕机械设备有限公司 | 上海道勤塑化有限公司 | 对辊破碎机_四辊破碎机_双齿辊破碎机_华盛铭重工 | 民用音响-拉杆音响-家用音响-ktv专用音响-万昌科技 | 播音主持培训-中影人教育播音主持学苑「官网」-中国艺考界的贵族学校 | 糖衣机,除尘式糖衣机,全自动糖衣机,泰州市长江制药机械有限公司 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 捆扎机_气动捆扎机_钢带捆扎机-沈阳海鹞气动钢带捆扎机公司 | 祝融环境-地源热泵多恒系统高新技术企业,舒适生活环境缔造者! | 众能联合-提供高空车_升降机_吊车_挖机等一站工程设备租赁 | 二维运动混料机,加热型混料机,干粉混料机-南京腾阳干燥设备厂 | 番茄畅听邀请码怎么输入 - Dianw8.com | 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 恒湿机_除湿加湿一体机_恒湿净化消毒一体机厂家-杭州英腾电器有限公司 | 新疆十佳旅行社_新疆旅游报价_新疆自驾跟团游-新疆中西部国际旅行社 | 耐压仪-高压耐压仪|徐吉电气| 航空连接器,航空插头,航空插座,航空接插件,航插_深圳鸿万科 | 烟台金蝶财务软件,烟台网站建设,烟台网络推广 | 赛尔特智能移动阳光房-阳光房厂家-赛尔特建筑科技(广东)有限公司 |