1.初学Qt的事件小坑记录(5)——事件的accept()和ignore()
2.Orthofinder 2.3
3.Qt的场景图Scene Graph
4.QT获取程序编译时间与当前时间的区别及应用场景
5.Qt笔记(十六)之鼠标 键盘事件
6.聊聊最近QSerialPort遇到的特性
初学Qt的小坑记录(5)——事件的accept()和ignore()
在Qt开发中,事件处理是记录构建交互界面的关键步骤。我们通常会重写一系列的源码事件函数,例如QWidget类中的事件mousePressEvent(QMouseEvent *)和mouseReleaseEvent(QMouseEvent *),以及QMainWindow类中的记录closeEvent(QCloseEvent *)等,以实现特定的源码多代理系统源码事件监听与处理功能。
Qt中,事件事件产生后首先由本Widget处理,记录然后按照对象树的源码路径向上传递给祖先Widget,直至根节点。事件若事件的记录m_accept参数设置为true,则事件处理终止。源码默认情况下,事件m_accept参数为true,记录这意味着事件通常只在最底层的源码Widget上执行一次。
举个例子,定义MainWindow类继承自QMainWindow,同时定义MyButton类,继承自QPushButton类,并复写mousePressEvent函数,附加一些调试信息。
通过mybutton.cpp和mainwindow.cpp两个文件,可以观察到:点击按钮外的其他部分时,输出"mousePressEvent of class MainWindow";而点击按钮时,输出"mousePressEvent of class MyButton"。这表明默认情况下,按钮的点击事件不会传递给其父窗口。
为了使父窗口捕获到鼠标点击事件,需要在MyButton::mousePressEvent函数末尾添加event->ignore();。这样将m_accept参数设置为false,点击按钮时会输出两条信息。
事件处理中还涉及accept()与ignore()函数。thinkphp 博客源码accept()将m_accept设置为true,表示组件希望处理事件,而ignore()则设置为false,表示组件忽略该事件。setAccepted(bool)是二者功能的等价调用。
在实际开发中,并未遇到需要显式调用accept()的情况,但某些事件传播方式可能与常规有所不同,尤其是在事件m_accept为false时,可能会出现需要特殊处理的场景。在分类讨论时,忽略事件后再次接受事件可能有助于简化逻辑。
此外,关于closeEvent(QCloseEvent *)的处理,一个常见的需求是在关闭窗口前弹出确认对话框。在复写closeEvent函数时,若调用event->ignore(),则关闭事件未被处理,窗口不会关闭;默认情况下或显式调用event->accept()表示允许关闭窗口。
在调用基类的closeEvent方法时,通常包含显式调用accept()以实现关闭窗口。此时,是否写入accept()或调用基类方法并无直接关系,只要m_accept参数为true,窗口就会调用hide()方法隐藏(如果设置过WA_DeleteOnClose,则进一步析构窗口对象)。总之,理解并灵活使用事件处理函数如accept()和ignore(),以及在特定场景下正确处理closeEvent,对于构建高效、响应式的php视频播放源码Qt应用至关重要。
Orthofinder 2.3
1.æ¥æ¾ç´ç³»åæºç¾¤(orthogroups)åç´ç³»åæºç©(orthologs)
2.æ¨æææç´ç³»åæºç¾¤çææ ¹åºå æ (rooted gene trees)
3.è¯å«è¿äºåºå æ ä¸çææåºå å¤å¶äºä»¶(gene duplication events)
4.æ¨æææ ¹ç©ç§æ (rooted species tree)ï¼å¹¶å°åºå å¤å¶äºä»¶ä»åºå æ æ å°å°ç©ç§æ ä¸
5.为ä¸åç©ç§åºå ç»é´çæ¯è¾åææä¾å ¨é¢çç»è®¡ä¿¡æ¯
éè¿ä¿®æ¹ config.json æ件ï¼OrthoFinder æ¯æç¨æ·èªå®ä¹è°ç¨è½¯ä»¶
STAGæ¯ä¸ç§ä»ææåºå æ¨æµç©ç§æ çç®æ³ï¼ä¸åäºä½¿ç¨åæ·è´çç´ç³»åæºåºå è¿è¡è¿åæ æ建ã
å为å¦ä¸å æ¥ï¼
1.BLAST all-vs-allæç´¢ã使ç¨BLASTP以evalue=e-3è¿è¡æç´¢ï¼å¯»æ¾æ½å¨çåæºåºå ã(é¤äºBLAST, è¿å¯ä»¥éæ©DIAMONDåMMSeq2)
2.åºäºåºå é¿åº¦åç³»ç»åè²è·ç¦»å¯¹BLAST bitå¾åè¿è¡æ ååã
3.使ç¨RBNHsç¡®å®åæºç»åºåæ§ç¸ä¼¼åº¦çéå¼
4.æ建ç´ç³»åæºç»å¾(orthogroup graph)ï¼ç¨ä½MCLçè¾å ¥
5.使ç¨MCLï¼Markov Cluster Algorithmï¼å¯¹åºå è¿è¡èç±»ï¼ååç´ç³»åæºç»
å ·ä½çåæååæ°è§£éè¿å¯è§ä¸æ çä¿¡ææ¯å ¬ä¼å· /s/eeaTOQUHh6zuhYbbLA_Lnw
æ åOrthoFinderè¿è¡ä¼çæä¸ç»æ件ï¼è¿äºæ件æè¿°äºç´ç³»åæºç¾¤ï¼ç´ç³»åæºï¼åºå æ ï¼è§£æåºå æ ï¼ææ ¹ç©ç§æ ï¼åºå å¤å¶äºä»¶ä»¥åæåæç©ç§éçæ¯è¾åºå ç»ç»è®¡æ°æ®ã
Orthogroups.tsvï¼ä¸ä¸ªå¶è¡¨ç¬¦åéçææ¬æä»¶ï¼ æ¯è¡å å«å±äºå个ç´ç³»åæºç¾¤çåºå ãæ¥èªæ¯ä¸ª ç´ç³»åæºç¾¤ï¼Orthogroupï¼OGXXXXï¼ åºå 被ç»ç»æåï¼æ¯ä¸ªç©ç§ä¸åã
Orthogroups_UnassignedGenes.tsvï¼ä¸ä¸ªå¶è¡¨ç¬¦åéçææ¬æ件ï¼å ¶æ ¼å¼ä¸Orthogroups.csvç¸åï¼ä½ å å«æªåé ç»ä»»ä½ç´ç³»åæºç¾¤çææåºå ã
Orthogroups.txt(ä¼ ç»æ ¼å¼):å å«Orthogroups.tsvæ件ä¸æè¿°çç´ç³»åæºç¾¤ï¼ä½ä½¿ç¨OrthoMCLè¾åºæ ¼å¼ã(æ¹ä¾¿éæ±)
Orthogroups.GeneCount.tsvï¼ä¸ä¸ªå¶è¡¨ç¬¦åéçææ¬æ件ï¼å ¶æ ¼å¼ä¸Orthogroups.csvç¸åï¼ è®°å½äºæ¯ä¸ª Orthogroup ä¸åºå å¨ç©ç§é´çåå¸æ åµï¼å¯ä»¥ç¨äºåæåæºåºå å¨ç©ç§é´çæ¶ç¼©åæ©å¼ ã
Orthogroups_SingleCopyOrthologues.txtï¼ åæ·è´ç´ç³»åæºç»ãæ¯ä¸ªç©ç§æ£å¥½å å«ä¸ä¸ªåºå çç´ç³»åæºç¾¤å表ï¼å³å®ä»¬å å«ä¸å¯¹ä¸çç´ç³»åæºç©ãå®ä»¬é常éåè¿è¡ç§é´æ¯è¾åç§æ æ¨æã(å®é 使ç¨æ¶åå¯ä»¥æ ¹æ®éæ±æé)ã建æ éæ©ç©ç§å¤ªå¤æ¶ï¼å¯è½æ件为空ã
以ç©ç§ä¸ºåä½ï¼è®°å½äºæ¯ä¸ªç©ç§ä¸å ¶ä»ç©ç§é´çç´ç³»åæºåºå ã
ç´ç³»åæºç©ç®å½ä¸ºæ¯ä¸ªç©ç§å å«ä¸ä¸ªåç®å½ï¼è¯¥åç®å½åå å«æ¬ç©ç§ä¸å ¶ä»ææç©ç§çæ对æ¯è¾æ件ï¼ååºè¯¥ç©ç§å¯¹ä¹é´çç´ç³»åæºç©ï¼Orthogroupï¼ã ç´ç³»åæºç©å¯ä»¥æ¯ä¸å¯¹ä¸ï¼ä¸å¯¹å¤æå¤å¯¹å¤ï¼è¿åå³äºç´ç³»åæºç©åååçåºå å¤å¶äºä»¶ã æ件ä¸çæ¯ä¸è¡é½å å«ä¸ä¸ªç©ç§ä¸çåºå ï¼è该åºå æ¯å¦ä¸ç©ç§ä¸è¯¥åºå çç´ç³»åæºç©ï¼å¹¶ä¸æ¯ä¸è¡é½è¢«äº¤åå¼ç¨å°å å«è¿äºåºå çç´ç³»ç¾¤ä¸ã
ç®åç¹è¯´ç´ç³»åæºç©(Orthologues)ç®å½è½å¤æ¾å°ä¿©ä¿©ç©ç§é´çææç´ç³»åæºåºå ã
æ¯ä¸ª ç´ç³»åæºç¾¤orthogroupï¼gene_num >= 4ï¼çææ ¹åºå æ ç»æã é»è®¤åºå æ 没ææ¯æå¼ï¼OrthoFinder 为äºèç计ç®æ¶é´æ²¡ç®äºï¼ææ¹æ³è·åæ¯æå¼ï¼æ²¡å»å¦ï¼ã
为æ¯ä¸ªç´ç³»åæºç¾¤æ¨æåºææ ¹çç³»ç»åè²æ ï¼ä½¿ç¨ OrthoFinderå¤å¶æ失å并模å è¿è¡è§£æã(æ ¹æ®éæ±ç¨)
详ç»è¯´æå¯è§ /s/eeaTOQUHh6zuhYbbLA_Lnw
SpeciesTree_rooted.txtï¼ä»ææå å«STAGæ¯æçç´ç³»åæºç»æ¨æçSTAGç©ç§æ ï¼ æ¤æ件æbootstrapå¼ã
SpeciesTree_rooted_node_labels.csvï¼ä¸ä¸è¿°ç¸åçæ ï¼ä½æ¯èç¹è¢«èµäºæ ç¾(èä¸æ¯æ¯æå¼)ï¼ç¨äºè§£éåºå éå¤æ°æ®ã
Orthogroups_for_concatenated_alignment.txtï¼ä» å¨ -M msa 模å¼ä¸è¾åºï¼ååºäºææ串èèµ·æ¥ç¨äºæ¨æç©ç§æ ç orthogroup ID
Duplications_per_Orthogroup.tsvï¼è®°å½äºæ¯ä¸ª orthogroup ä¸æ¨æåºçåºå éå¤äºä»¶æ°éã
Duplications_per_Species_Tree_Node.tsvï¼ è®°å½äºç©ç§æ ä¸æ¯ä¸ªèç¹ãç©ç§ä¸åçåºå éå¤äºä»¶çæ°éã
Orthogroups_SpeciesOverlaps.tsvï¼ æ¯ä¸ªç©ç§å¯¹ä¹é´å ±äº«ç orthogroup ç´ç³»åæºç¾¤ ï¼ä»¥æ¹ç©éµå½¢å¼ï¼ã ä¸åç©ç§é´çåæºåºå ç交é
OrthologuesStats _ *.tsvï¼æ¯å¶è¡¨ç¬¦åéçææ¬æ件ï¼å ¶ä¸å å«ç©éµï¼è¿äºç©éµç»åºäºæ¯å¯¹ç©ç§ä¹é´ä¸å¯¹ä¸ï¼ä¸å¯¹å¤åå¤å¯¹å¤å ³ç³»çç´ç³»åæºç©æ°éã
Statistics_Overall.tsvï¼è®°å½äºæå ³ orthogroup ç常è§ç»è®¡ä¿¡æ¯ã
Statistics_PerSpecies.tsvï¼ä»¥ç©ç§ä¸ºåä½ï¼è®°å½äºæå ³ orthogroup ç常è§ç»è®¡ä¿¡æ¯ã
OrthologuesStats _ *ï¼è®°å½äºæ¯å¯¹ç©ç§ä¹é´ä¸å¯¹ä¸ãä¸å¯¹å¤åå¤å¯¹å¤å ³ç³»çç´ååæºç©æ°éã
å¨Statistics_Overall.csv åStatistics_PerSpecies.csvä¸çä¸äºåè¯ï¼
Species-specific orthogroupï¼ å®å ¨ç±ä¸ä¸ªç©ç§çåºå ç»æçç´ç³»åæºç¾¤ ã
GåOï¼æçæ¯å½ä½ ç´ç³»åæºç»æç §åºå æ°ä»å¤§å°å°è¿è¡æåï¼ç¶åç´¯å ï¼å½å å ¥æ个ç»åï¼ç´¯è®¡åºå æ°å¤§äº%çæ»åºå æ°ï¼é£ä¹æéè¦çç´ç³»åæºç»çæ°ç®å°±æ¯Oï¼è¯¥ç»çåºå æ°ç®å°±æ¯Gã
Single-copy orthogroup: åæ·è´ç´ç³»åæºç¾¤ï¼ æ¯ä¸ªç©ç§ä¸ä» æä¸ä¸ªåºå çç´ç³»åæºç¾¤ ãè¿äºç´ç³»åæºç¾¤æ¯æ¨æç©ç§æ å许å¤å ¶ä»åæççæ³éæ©ã
Unassigned gene: æªåé çåºå ï¼ æ æ³ä¸ä»»ä½å ¶ä»åºå æ¾å ¥ç´ç³»åæºç¾¤çåºå ï¼æ æ³åå ¶ä»åºå è¿è¡èç±»çåºå ã
æ¥æåºå æ æå³ç OrthoFinder å¯ä»¥è¯å«åççææåºå å¤å¶äºä»¶ãOrthoFinder å¨æ件Species_Tree/ SpeciesTree_rooted_node_labels.txt ä¸æ è®°ç©ç§æ çèç¹ã
ä¸å¾ä¸ºèªå¸¦æ¡ä¾ä¸ç´ç³»åæºç» OG çææ ¹åºå æ ç»æãé¦å åæ Nï¼node ï¼ï¼å ¶å·¦å³æ NãN æ¯æç³»åæºï¼agalï¼ï¼è¯´æ N åçäºä¸æ¬¡åºå å¤å¶ãä¸æéå½å¯ä»¥åç°ï¼N ååçäº 4 次åºå å¤å¶ãåçåæ Nï¼å ¶ä¸ N2ãN4ãN6 为æç³»åæºï¼geniï¼ï¼è¯´æ N ååçäº 2 次åºå å¤å¶ãç»å NãNï¼è¯´æ N ååçäº 6 次åºå å¤å¶ãç±äº agalãgeni ä¸åºå ä¸ N1 åä¸æ¯æç³»åæºï¼æ以 OG ä¸æ»å ±åçäº 6 次åºå å¤å¶äºä»¶ã
Duplications.tsvï¼è®°å½äºç¨åºæ¨æµåºçææåºå å¤å¶äºä»¶çä¿¡æ¯ãå ¶ä¸ Species Tree Node 表示åºå å¤å¶äºä»¶åçæ¶æ对åºçç©ç§æ èç¹ï¼å³å¤å¶æ¯å¨è¯¥ç©ç§å åççï¼ï¼Gene tree node 表示åºå å¤å¶äºä»¶åçæ¶æ对åºçåºå æ èç¹ä¸åºå å¤å¶äºä»¶å¯¹åºçèç¹ï¼Support 表示å¤å¶å两个åºå å¯æ¬æªè¢«ä¸¢å¤±çæ¯ä¾ï¼Type ä¸ Terminal 表示éå¤åçå¨ç©ç§æ çæ«ç«¯åæ¯ä¸ï¼Non-Terminal 表示éå¤åçå¨ç©ç§æ çå é¨åæ¯ä¸ï¼è¢«å¤ä¸ªç©ç§å ±äº«ï¼Genes 1ãGenes 2 为åºå å表ï¼å ¶ä¸ Genes 1 表示æ¥èªå¤å¶ååºå çä¸ä¸ªå¯æ¬ï¼Genes 2 表示æ¥èªå¤å¶ååºå çå¦ä¸ä¸ªå¯æ¬ã
SpeciesTree_Gene_Duplications_0.5_Support.txt ï¼è®°å½äºç©ç§æ æ¯ä¸ªèç¹ãåæä¸å å«çåºå å¤å¶äºä»¶çæ»åï¼æ ¼å¼ä¸ºèç¹æç©ç§å + æ°åï¼åºå å¤å¶äºä»¶æ°éï¼ã
以ä¸ç»åºäºåºå å¤å¶äºä»¶çSummaryãå ¶ä¸æ¯ä¸ªèç¹æ¾ç¤ºèç¹å称ï¼åè·ä¸ä¸ªä¸å线ï¼ç¶åæ¯æ å°å°ç©ç§æ ä¸æ¯ä¸ªèç¹å åæ¯æçåºå å¤å¶äºä»¶çæ°éãå¦æè³å° % çå代ç©ç§ä¿çäºå¤å¶åºå ç两个æ·è´ï¼ååºå å¤å¶äºä»¶è¢«è®¤ä¸ºæ¯âå¾å°å åæ¯æçâãä¾ï¼å¯¹äºå足å¨ç©çå ±åç¥å N1ï¼æ 个å¾å°å åæ¯æçåºå å¤å¶äºä»¶ã
æ¯ä¸ªç´ç³»åæºç¾¤çFASTAæ件ç»åºäº æ¯ä¸ªç´ç³»åæºç¾¤ä¸æ¯ä¸ªåºå çæ°¨åºé ¸åºåã
ä¸ç´ç³»åæºç¾¤åºåç®å½ç¸åçæ件ï¼ä½ ä» éäºæ¯ä¸ªç©ç§ä» å å«ä¸ä¸ªåºå çç´ç³»åæºç¾¤ã
æ¤æä»¶å¤¹ä» å¨ -M msa 模å¼ä¸è¾åºï¼å为 FASTA æ ¼å¼æ件ã
1.è®°å½äºæ¯ä¸ª orthogroup ä¸åºåé´çå¤åºåæ¯å¯¹ç»æã
2.è®°å½äºç¨åºéè¿ CMSA ç®æ³è¿æ»¤åç orthogroup ä¸ååºå串èåçå¤åºåæ¯å¯¹ç»æï¼åæ¶æ¯å¯¹ç»æä¸ç©ºä½æ° > % çå已被å é¤ã
è¿ä¼æä¸ä¸ªå为WorkingDirectoryçç®å½ï¼å ¶ä¸å å«è¿ç®è¿ç¨çä¸é´æ件ï¼ä¾å¦blastç»æï¼DIAMOND æ¯å¯¹ç»æï¼STAG è¾åºçæ æ ¹ç©ç§æ çã2.3.çæ¬è¿çæäºä¸äºå ¶ä»æ件夹ï¼æ²¡çäº
1.åºå æ (Gene Trees)ï¼ æ ¹æ®æ¯ä¸ªç´ç³»åæºç¾¤æ¨æçç³»ç»åè²æ ã
åºå æ ï¼æåºäºå个åæºåºå å·®å¼æ建çç³»ç»åçæ ãè¿ç§æ 代表çä» ä» æ¯å个åºå çè¿ååå²ï¼èä¸æ¯å®æå¨ç©ç§çè¿ååå²ã
Orthogroups_SingleCopyOrthologues.txtï¼ç¨æ¥çç»åºå æ åºè¯¥éæ©åªä¸ä¸ªç´ç³»åæºç¾¤çæ件ã该æ件ä¸æ¯ä¸ªç©ç§æ£å¥½å å«ä¸ä¸ªåºå çç´ç³»åæºç¾¤å表ï¼å³å®ä»¬å å«ä¸å¯¹ä¸çç´ç³»åæºç©ãå®ä»¬é常éåè¿è¡ç§é´æ¯è¾åç§æ æ¨æã
2.解æçåºå æ (Resolved Gene Trees)ï¼ ä¸ºæ¯ä¸ªç´ç³»åæºç¾¤æ¨æåºææ ¹çç³»ç»åè²æ ï¼ä½¿ç¨OrthoFinderå¤å¶æ失å并模åè¿è¡è§£æã
3.ç©ç§æ (Species Tree)ï¼ ä»ææç´ç³»åæºç¾¤æ¨æåºçSTAGç©ç§æ ï¼å å«å é¨èç¹ä¸çSTAGæ¯æå¼ï¼å¹¶ä»¥STRIDEä¸ºæ ¹ï¼-M dendroblastï¼ã
大é¨åé½æ¯ææçï¼è®°å½æéçå°æ¹ï¼éº»ç¦æ¹è¯ææ£äºã
çå¾å¤´æï¼æºå¤è¿æ²¡ç解ï¼åé¢å¼WGDåæ¥çç
声æï¼æ¬ç¯å¤ä¸ºèµææ´çæ»ç»ï¼ä» ç¨äºèªå¦è®°å½ï¼ä¾µå ï¼è°¢è°¢ãæè°¢ä½è 大大们å享ï¼
OrthoFinder /davidemms/OrthoFinder
xuzhougeng /p/e0bbb2ba
æµé¦é¸è ¿é¢ /s/Jny5cTHqQh9yQx-cKQTWbA#tocbar--ebkh9l
çä¿¡ææ¯ /s/eeaTOQUHh6zuhYbbLA_Lnw
Qt的场景图Scene Graph
场景图在Qt Quick 2.0中扮演关键角色,它基于已知要绘制内容构建。所有QML项目均使用此图进行渲染,其默认实现与OpenGL紧密相连,旨在提供高效性能。
Qt与OSG的场景图结构类似,都通过构建不同节点间的特定关系进行组织。然而,两者在节点数量和关联的渲染状态方面存在差异。Qt的场景图直接进行渲染,而OSG则将场景图转换为渲染树以避免频繁的渲染状态切换。
Qt的场景图基于界面元素的位置、透明度等信息构建,而OSG场景图则直接通过节点构建。这意味着用户在Qt中不直接参与场景图的构建,而在OSG中则可直接参与。
举例来说,假设界面包含包含十个项目的列表,每个项目都有背景色、图标和文本。使用传统绘图技术,这可能导致次绘图调用和类似数量的状态更改。相比之下,场景图可以重组原始图元以进行渲染,仅需一次调用即可绘制所有背景、图标和文本,将绘制调用总数减少到3次。这种批处理和状态更改的减少,可以显著提高某些硬件的性能。
场景图由QQuickWindow类管理和呈现,用户可以自定义Item类型通过调用QQuickItem :: updatePaintNode()将其图形基元添加到场景图中。linux 调度源码分析场景图是Item场景的图形表示,包含渲染所有项目的足够信息。在许多平台上,场景图形甚至会在GUI线程准备下一帧状态时在专用渲染线程上进行渲染。
场景图由许多预定义节点类型组成,每个类型都有特定用途。尽管被称为场景图,其实更准确地定义为节点树。该树由QML场景中的QQuickItem类型构建,并由渲染该场景的渲染器处理。节点本身不包含任何绘图代码或虚拟paint()函数。
用户可以添加自定义节点到场景图,即使是表示3D模型的完整子树。在场景图中最重要的节点是QSGGeometryNode,用于定义自定义图形的几何形状和材质。使用QSGGeometry定义几何形状,并描述图形图元的形状或网格。材质定义如何填充此形状的像素。
一个节点可以拥有任意数量的子节点,这些几何节点按照子顺序进行渲染,父级在子级之后。常见的节点包括QSGSimpleRectNode和QSGSimpleTextureNode,它们是QSGGeometryNode的子类,分别用于定义矩形几何形状的纯色材质和纹理材质。
节点的所有权通常由创建者或场景图通过QSGNode :: OwnedByParent明确完成。使用线程渲染循环时,图形API(如OpenGL、Vulkan、Metal等)操作以及与场景图的交互必须专门在渲染线程上进行,通常在updatePaintNode()调用期间。
材质描述了如何填充QSGGeometryNode中几何图形的asp access 源码下载内部,它封装了用于图形管线顶点和片段阶段的图形着色器。对于只需将自定义阴影应用于QML Item类型的用户,可以使用ShaderEffect类型在QML中直接执行此操作。
材质类别包括纯色、纹理填充等。便利节点旨在简化常见自定义节点的使用,例如QSGSimpleRectNode和QSGSimpleTextureNode。
场景图的呈现发生在QQuickWindow类内部,但呈现管道中有一些地方可供用户附加应用程序代码。可以通过直接调用场景图使用的图形API(如OpenGL、Vulkan、Metal等)来添加自定义场景图内容或插入任意渲染命令。共有三种渲染循环变体:基本、窗口和线程。其中,基本和窗口是单线程的,线程在专用线程上执行场景图渲染。
线程和Windows渲染循环依赖于图形API实现来节流。基于线程的渲染循环可以在多个配置中使用,以增加多核处理器的并行度,并更好地利用停顿时间。这可以显着提高性能,但对与场景图进行交互的位置和时间施加了限制。
在许多配置中,场景图渲染将在专用渲染线程上进行。这样做是为了增加多核处理器的并行度,并更好地利用停顿时间,例如等待阻塞交换缓冲区调用。这可以显着提高性能,但对与场景图进行交互的位置和时间施加了限制。
关于渲染过程,当QML场景中发生更改并调用QQuickItem :: update()时,事件被发布到渲染线程以启动新帧。渲染线程准备绘制新帧。在渲染线程准备新帧时,GUI线程调用QQuickItem :: updatePolish()对项目进行最终修饰,然后再渲染它们。然后,阻塞GUI线程,发出QQuickWindow :: beforeSynchronizing()信号,进行必要的准备工作。接着,将QML状态同步到场景图中,渲染场景图,然后发出QQuickWindow :: frameSwapped()信号。
在渲染线程正在渲染时,GUI可以自由地进行动画、处理事件等。在默认情况下,线程渲染器可以使用OpenGL、Vulkan、Metal、移动平台、EGLFS嵌入式Linux平台等。通过设置QSG_RENDER_LOOP = threaded,始终可以强制使用线程渲染器。
场景图日志功能支持多个类别,帮助跟踪性能问题和错误。例如,qt.scenegraph.time.texture记录进行纹理上传的时间,qt.scenegraph.time.compilation记录着色器编译的时间等。在遇到图形问题或不确定使用的渲染循环或图形API时,应始终启用qt.scenegraph.general和qt.rhi类别,以获得初始化期间打印的一些基本信息。
场景图还具有适应层,该层允许硬件特定的优化,包括自定义纹理、渲染器、动画驱动程序、渲染循环等。通过这些机制,Qt能够充分利用硬件资源,提高渲染性能。
QT获取程序编译时间与当前时间的区别及应用场景
1. 编译时间与运行时间的区别- 编译时间,即源代码编译完成的日期和时间,它固定在编译阶段,用于标识代码版本和历史变更,通常在代码版本控制或维护记录中发挥作用。比如,你可以通过 "__DATE__" 和 "__TIME__" 获取这个信息,如在代码中设置 QString dateTime; dateTime += __DATE__; dateTime += " "; 然后输出到文本框。
- 运行时间,则是程序在执行过程中获取的当前日期和时间,它会随着程序的运行而动态变化。例如,通过`QDateTime::currentDateTime();`获取当前时间并显示在文本框中,如`ui->textEdit_2->setText(QDateTime::currentDateTime().toString());`。
2. 获取方法与应用- 编译时间获取,通过特定的编译时宏(如`__DATE__`和`__TIME__`)获取,然后将结果显示在UI元素中,如`ui->textEdit->setText(dateTime);`。
- 运行时间获取,使用Qt库中的`QDateTime::currentDateTime()`函数获取并显示,如直接输出当前日期和时间到`ui->textEdit_2`。
在实际应用中,编译时间用于记录源代码的历史,而运行时间则用于实时操作或记录事件,如日志生成或监控程序运行状态。程序启动时的编译时间和系统时钟并不一致,但程序运行时的当前时间和系统时钟是同步的。
Qt笔记(十六)之鼠标 键盘事件
事件的获取在软件开发中比较常见。鼠标左键单击/双击时事件、按键按下事件是楼主接触较多的。今天,我们将梳理常见的鼠标、键盘事件,作详细记录。
Qt提供的事件监测接口方便快捷,通常只需重写对应的函数。
事件分类如下:
1. 鼠标按下事件
2. 鼠标移动事件
注:mouseMoveEvent默认在鼠标按下时检测。若需检测鼠标移动而无需按下,可设置setMouseTracking(true)。
3. 鼠标双击事件
4. 鼠标滚轮事件
5. 按键按下事件
6. 按键抬起事件
我们通过代码演示上述事件的应用效果:
核心代码示例:
效果呈现:
如需获取更详细代码实现,请参考CSDN链接:Qt笔记(十六)之鼠标 键盘事件
聊聊最近QSerialPort遇到的特性
在最近的Qt串口编程中,我遇到了一个关于数据准备就绪的特性问题,这里记录一下我的解决过程。
原本以为这个问题已经解决,但实际工作中遇到的问题促使我重新审视官方文档。官方描述中提到,当知道端口准备好读写时,可以调用read()或write()等方法。然而,"数据准备就绪"这一概念的时机并未明确给出,这成为了一个疑惑点。
查阅文档时,我发现了一个函数,它在数据可读写时触发readyRead信号,即"数据准备就绪",但依然没有提及具体何时达到这个状态。在QtBug中,我发现了年的一个报告,似乎证实了官方文档可能存在描述上的不足。
在对事件循环的理解上,我开始意识到事件的优先级在决定数据处理顺序上扮演关键角色。事件循环的执行并非立即,而是按照优先级顺序。这就意味着,即使数据已经发送出去,用户可能会感受到延迟,但实际上是数据在缓冲区等待适当时机被处理。
总结起来,有三个关键点:首先,read前需要readReady状态;其次,readReady前数据可能先存入缓冲区;最后,从缓冲区读取数据需要通过waitForReadyRead或processEvents将数据放入事件循环,而这个过程受到事件优先级的控制,不会立即执行。
解决这个问题的直接方法是调整事件的优先级。作为五年经验的Qt开发者,我对这个特性有了更深入的理解,但仍有讨论的空间。欢迎一起探讨。
qt日志功能
电脑中的qt日志,蕴含着信息的宝藏,也可能成为无用的数据泥潭。网络设备、系统和服务程序在运行时,会产生名为log的事件记录。每一行qt日志包含日期、时间、用户和动作等操作描述。Windows网络操作系统配备多种qt日志,包括应用程序日志、安全日志、系统日志、Scheduler服务日志、FTP日志、WWW日志、DNS服务器日志等。这些日志因系统配置的服务差异而有所不同。当我们对系统执行操作时,qt日志通常会记录相关信息,对系统安全人员而言极为有价值。例如,当有人进行IPC探测时,系统会在安全日志中迅速记录探测者的IP、时间、用户名等信息;通过FTP探测后,FTP日志会记录IP、时间、使用用户名等信息。qt日志对实现网络安全的价值取决于两个关键因素:一是系统和设备需要适当设置以记录所需数据;二是必须具备合适的工具、培训和资源来分析收集的数据。