国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

QML實(shí)現(xiàn)文件十六進(jìn)制數(shù)據(jù)展示

這篇具有很好參考價(jià)值的文章主要介紹了QML實(shí)現(xiàn)文件十六進(jìn)制數(shù)據(jù)展示。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

將一個(gè)二進(jìn)制文件直接拖放到Qt Creator中可以直接查看到以十六進(jìn)制顯示的數(shù)據(jù)格式,如:
QML實(shí)現(xiàn)文件十六進(jìn)制數(shù)據(jù)展示,QML十六進(jìn)制數(shù)據(jù),hexview,十六進(jìn)制,二進(jìn)制文件
要實(shí)現(xiàn)一個(gè)這樣的效果,還是要花不少時(shí)間的。

在網(wǎng)上找了挺多示例,其中一個(gè)開源代碼效果不錯(cuò)(參考這里),但是是在QWidget中實(shí)現(xiàn)的,通過(guò)繼承QAbstractScrollArea來(lái)實(shí)現(xiàn)數(shù)據(jù)滾動(dòng)繪制。

如果QML中要自定義在paint中繪制,需要繼承QQuickPaintedItem,那要實(shí)現(xiàn)這樣的滾動(dòng)分頁(yè)展示就比較麻煩了。嘗試了一下直接將Widget中實(shí)現(xiàn)的效果封裝一下放到QML中去使用,就會(huì)比較省事,畢竟原有的開源效果已經(jīng)做得很好了。
以此思路,開搞?。?!

先來(lái)看效果:
QML實(shí)現(xiàn)文件十六進(jìn)制數(shù)據(jù)展示,QML十六進(jìn)制數(shù)據(jù),hexview,十六進(jìn)制,二進(jìn)制文件
這是在QML項(xiàng)目中實(shí)現(xiàn)的,中間的數(shù)據(jù)展示部分是使用QHexView代碼Widget實(shí)現(xiàn)的。


本文demo 點(diǎn)擊下載


正文

將Widget嵌入到QML中使用,先來(lái)看會(huì)遇到什么問(wèn)題。

上面說(shuō)到,QML中要自定義在paint中繪制,需要繼承QQuickPaintedItem,然后重寫paint函數(shù),而QML Scene Graph場(chǎng)景圖繪制是在兩個(gè)不同的線程中,這個(gè)在Qt幫助文檔中有說(shuō)明:
QML實(shí)現(xiàn)文件十六進(jìn)制數(shù)據(jù)展示,QML十六進(jìn)制數(shù)據(jù),hexview,十六進(jìn)制,二進(jìn)制文件
也就是說(shuō),paint()不是從主GUI線程調(diào)用的,而是從啟用GL的渲染器線程調(diào)用的.。

那這會(huì)帶來(lái)什么問(wèn)題呢,繼續(xù)看
由于主UI框架是用QML做的,我們想把Widget嵌入到QML中使用,就需要新建一個(gè)類繼承QQuickPaintedItem然后把Widget放到其中,封裝起來(lái)后將該類通過(guò)qmlRegisterType注冊(cè)交給QML去引用。那Widget窗口中的各種事件就需要從QML這邊發(fā)送過(guò)去,所以需要進(jìn)行一次事件轉(zhuǎn)發(fā),也就是說(shuō)將QQuickPaintedItem獲得的事件合理的轉(zhuǎn)發(fā)給QWidget讓QWidget能處理對(duì)應(yīng)的消息。這個(gè)可以通過(guò)在QQuickPaintedItem中過(guò)濾事件后進(jìn)行轉(zhuǎn)發(fā)。
而UI渲染是在paint中調(diào)用widget的rander進(jìn)行,我們知道Widget中UI渲染是在主線程,上面講到 QQuickPaintedItem中的paint()不是從主GUI線程調(diào)用的,而是從啟用GL的渲染器線程調(diào)用的,所以這樣調(diào)用就會(huì)出現(xiàn)斷言報(bào)錯(cuò):

 "Cannot send events to objects owned by a different thread. Current thread 0x0x24f6d9d9db0. Receiver ''....

好在我們可以直接用Release模式規(guī)避這個(gè)斷言,沒(méi)辦法,只能這樣搞了,也只有這種方式能實(shí)現(xiàn)這種非常規(guī)的調(diào)用。

繼承QQuickPaintedItem封裝的關(guān)鍵代碼:

HexViewItem::HexViewItem()
{
    this->setAcceptHoverEvents(true);
    this->setAcceptedMouseButtons(Qt::AllButtons);
    setFlag(ItemAcceptsInputMethod, true);
    setFlag(ItemIsFocusScope, true);
    setFlag(ItemHasContents, true);
}

//不能在構(gòu)造函數(shù)中調(diào)用
void HexViewItem::init()
{
    m_pHexContainer = new HexViewContainer();
    m_pHexContainer->init();
    qDebug() << __FUNCTION__ << "this size" << size();
    m_pHexContainer->resize(this->size().toSize());
    if(m_pHexContainer)
    {
        m_pHexContainer->createWinId();
        m_pHexContainer->installEventFilter(this);

        QWindow* pw = (QWindow*)(window());
        pw->installEventFilter(this);
        this->update();
    }
}

bool HexViewItem::sendEventToWidget(QEvent *e)
{
    if(!m_pHexContainer)return false;
    QWindow* wHandle = m_pHexContainer->windowHandle();
    bool res = false;
    if(wHandle)
    {
        res = qApp->sendEvent(wHandle, e);
    }
    return res;
}


void HexViewItem::paint(QPainter *painter)
{
    painter->save();
    if(m_pHexContainer)
    {
        m_pHexContainer->render(painter);
    }
    painter->restore();
}

bool HexViewItem::eventFilter(QObject *obj, QEvent *e)
{
    QWindow* pw = (QWindow*)(window());
    bool res = QQuickPaintedItem::eventFilter(obj, e);
    if(obj == m_pHexContainer)
    {
        switch(e->type())
        {
        case QEvent::Paint:
        {
            QPaintEvent* pe = (QPaintEvent*)e;
            this->update(pe->rect());
        }
            break;
        }
    }
    else if(obj == pw)
    {
        //* 如果是鼠標(biāo)等(有鼠標(biāo)坐標(biāo)信息的事件。)的話我們得計(jì)算一下偏移量并修正一下,這里就只處理QMouseEvent和QWheelEvent作為示例
        //* 如果有其他類似的也需要修正,不然可能坐標(biāo)偏移
        switch(e->type())
        {
        case QEvent::MouseButtonDblClick  :
        case QEvent::MouseButtonPress	  :
        case QEvent::MouseButtonRelease	  :
        case QEvent::MouseMove	          :
        case QEvent::MouseTrackingChange  :
        case QEvent::Move	              :
        {
            QMouseEvent *me = (QMouseEvent*)e;
            QEvent::Type type = me->type();
            QPointF localPosF = me->localPos();
            Qt::MouseButton mouseButton = me->button();
            Qt::MouseButtons mouseButtons = me->buttons();
            Qt::KeyboardModifiers modifiers = me->modifiers();

            //修正一下localpos
            QPointF offsetF = mapToScene(QPoint(0,0));
            QPointF diffPosF = localPosF - offsetF;

            QMouseEvent tme(type, diffPosF, mouseButton, mouseButtons, modifiers);
            sendEventToWidget(&tme);
        }
            break;
        case QEvent::Wheel:
        {
            QWheelEvent *we = (QWheelEvent*)e;
            QPointF localPosF = we->posF();
            QPointF gloabalPosF = we->globalPosF();
            QPoint  pixelDelta = we->pixelDelta();
            QPoint  angleDelta = we->angleDelta();
            int qt4Delta = we->delta();
            Qt::Orientation orientation = we->orientation();
            Qt::MouseButtons mouseButtons = we->buttons();
            Qt::KeyboardModifiers modifiers = we->modifiers();

            //修正一下localpos
            QPointF offsetF = mapToScene(QPoint(0,0));
            QPointF diffPosF = localPosF - offsetF;

            QWheelEvent twe(diffPosF, gloabalPosF, pixelDelta, angleDelta, qt4Delta, orientation, mouseButtons, modifiers);
            sendEventToWidget(&twe);
        }
            break;
        default:
        {
//             sendEventToWidget(e);
        }
            break;
        }
    }

    return res;
}

void HexViewItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
{
    QQuickPaintedItem::geometryChanged(newGeometry, oldGeometry);

    if(m_pHexContainer)
    {
        m_pHexContainer->setGeometry(newGeometry.toRect());
    }
}

bool HexViewItem::event(QEvent *e)
{
    return __super::event(e);
}

關(guān)鍵點(diǎn),將QQuickItem的窗口注冊(cè)事件過(guò)濾器:

QWindow* pw = (QWindow*)(window());
pw->installEventFilter(this);

eventFilter就是過(guò)濾一些需要用到的關(guān)鍵事件進(jìn)行轉(zhuǎn)發(fā),在paint()中調(diào)用Widget的render進(jìn)行UI刷新。

QHexView源碼進(jìn)行過(guò)一些修改,添加了一些接口可供QML中快速設(shè)置,如:高亮某段數(shù)據(jù)、快速定位,頭部底部對(duì)齊,主題切換,截圖保存,切換展示寬度等

Q_INVOKABLE void setFilePath(int index, QString filePath);
Q_INVOKABLE void updateGeo();
Q_INVOKABLE void setSelect(int index,int pos,int len);
Q_INVOKABLE void closeFile(int index);  //關(guān)閉文件
Q_INVOKABLE void alignment(bool head,int index = -1);  //頭部 尾部對(duì)齊
Q_INVOKABLE QStringList renderHexView(QList<int> fileIndexs);
Q_INVOKABLE void setTheme(bool darkTheme);
Q_INVOKABLE void setHexLineWidth(quint8 value);

可在此基礎(chǔ)上進(jìn)行擴(kuò)展。

整體目錄結(jié)構(gòu):
QML實(shí)現(xiàn)文件十六進(jìn)制數(shù)據(jù)展示,QML十六進(jìn)制數(shù)據(jù),hexview,十六進(jìn)制,二進(jìn)制文件


本文demo 點(diǎn)擊下載


參考文章:
https://blog.csdn.net/r5014/article/details/92642626
https://github.com/Dax89/QHexView文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-701534.html

到了這里,關(guān)于QML實(shí)現(xiàn)文件十六進(jìn)制數(shù)據(jù)展示的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【FPGA仿真】Matlab生成二進(jìn)制、十六進(jìn)制的txt數(shù)據(jù)以及Vivado讀取二進(jìn)制、十六進(jìn)制數(shù)據(jù)并將結(jié)果以txt格式保存

    在使用Vivado軟件進(jìn)行Verilog程序仿真時(shí)可能需要對(duì)模塊輸入仿真的數(shù)據(jù),因此我們需要一個(gè)產(chǎn)生數(shù)據(jù)的方法(二進(jìn)制或者十六進(jìn)制的數(shù)據(jù)),Matlab軟件是一個(gè)很好的工具,當(dāng)然你也可以使用VS等工具。 以下分別給出了使用Matlab模擬產(chǎn)生二進(jìn)制和十六進(jìn)制數(shù)據(jù)的例子,例子僅供參

    2024年02月01日
    瀏覽(145)
  • Ubuntu vim 以十六進(jìn)制的形式顯示文件內(nèi)容

    Ubuntu vim 以十六進(jìn)制的形式顯示文件內(nèi)容

    Vim(Vi IMproved)是一款開源的文本編輯器,是 Unix 系統(tǒng)中經(jīng)典的 vi 編輯器的改進(jìn)版本。它具有強(qiáng)大的功能和高度可定制性,被廣泛應(yīng)用于程序開發(fā)、系統(tǒng)管理和文本編輯等領(lǐng)域。 以下是 Vim 的一些主要特點(diǎn)和功能: 模態(tài)編輯:Vim 包含多種編輯模式,包括普通模式、插入模式

    2024年02月13日
    瀏覽(25)
  • 十六進(jìn)制數(shù)如何轉(zhuǎn)十進(jìn)制 C/C++實(shí)現(xiàn)

    十六進(jìn)制數(shù)如何轉(zhuǎn)十進(jìn)制 C/C++實(shí)現(xiàn)

    一.問(wèn)題分析 我們輸入一個(gè)真正意義上的十六進(jìn)制數(shù),0x開頭,返回一個(gè)十進(jìn)制數(shù)。 二.思路生成 輸入一個(gè)十六進(jìn)制的數(shù),依次取出它的每一位,然后根據(jù)權(quán)值累加,得到10進(jìn)制值。 三.問(wèn)題解決及代碼 以C++為例 1.如何輸入一個(gè)16進(jìn)制數(shù),使用標(biāo)志符hex,cinhex\\\"變量名\\\" 如果指定

    2024年02月04日
    瀏覽(33)
  • MATLAB輸出串口發(fā)送所需十六進(jìn)制數(shù)據(jù)

    MATLAB輸出串口發(fā)送所需十六進(jìn)制數(shù)據(jù)

    ??可以用一個(gè)文件來(lái)測(cè)試其是否符合我們的要求,將一個(gè)二進(jìn)制向量轉(zhuǎn)化為十六進(jìn)制向量,每個(gè)十六進(jìn)制數(shù)表示1byte(不足1byte前面補(bǔ)0),并且寫入txt文件中,每byte之間用空格隔開。 ??打開存儲(chǔ)路徑下的txt文件,可見(jiàn)符合預(yù)期需求。 ??使用串口助手載入txt文件,可見(jiàn)

    2024年02月16日
    瀏覽(24)
  • rk3566通過(guò)stty向串口發(fā)送十六進(jìn)制數(shù)據(jù)

    rk3566通過(guò)stty向串口發(fā)送十六進(jìn)制數(shù)據(jù)

    在Unix或Linux系統(tǒng)中,stty命令可以用于設(shè)置和控制終端的參數(shù)。要發(fā)送十六進(jìn)制數(shù)據(jù)給串口,需要使用stty命令設(shè)置終端為raw模式,這樣終端就不會(huì)將輸入或輸出數(shù)據(jù)進(jìn)行任何處理。然后,可以使用echo命令將十六進(jìn)制數(shù)據(jù)寫入串口。 以下是在Linux系統(tǒng)中發(fā)送十六進(jìn)制數(shù)據(jù)的步驟

    2023年04月10日
    瀏覽(29)
  • sm3加密(32位哈希,64位十六進(jìn)制數(shù)據(jù))

    https://blog.csdn.net/nicai_hualuo/article/details/121555000 中介紹了sm3的算法并給出了可用代碼,我只是將其拷貝過(guò)來(lái),測(cè)試、去掉多余的輸出,并進(jìn)行了簡(jiǎn)單封裝,以方便項(xiàng)目中使用。 修正了十六進(jìn)制轉(zhuǎn)字符串和十進(jìn)制的方法支持小寫的十六進(jìn)制字符串。 用法見(jiàn)main函數(shù)。

    2024年02月11日
    瀏覽(22)
  • Qt自定義窗口部件/控件(實(shí)現(xiàn)一個(gè)十六進(jìn)制微調(diào)框SpinBox)

    Qt自定義窗口部件/控件(實(shí)現(xiàn)一個(gè)十六進(jìn)制微調(diào)框SpinBox)

    在某些情況下,我們發(fā)現(xiàn)Qt窗口控件需要更多的自定義定制,這些定制可能要比它在Qt設(shè)計(jì)師里可設(shè)置的屬性或者對(duì)它調(diào)用的那些函數(shù)更多一些。一個(gè)簡(jiǎn)單而直接的解決方法就是對(duì)相關(guān)的窗口部件類進(jìn)行子類化并且使它能夠滿足我們的需要。 本文主要是通過(guò)實(shí)現(xiàn)一個(gè)十六進(jìn)制微調(diào)

    2024年02月11日
    瀏覽(28)
  • STM32將數(shù)據(jù)從十六進(jìn)制轉(zhuǎn)換為ascii通過(guò)串口發(fā)送顯示
  • Linux C/C++ 分析網(wǎng)絡(luò)流量(十六進(jìn)制TCP數(shù)據(jù)包分析)

    Linux C/C++ 分析網(wǎng)絡(luò)流量(十六進(jìn)制TCP數(shù)據(jù)包分析)

    在分析TCP數(shù)據(jù)包時(shí),理解TCP協(xié)議的工作原理和報(bào)文格式是關(guān)鍵。TCP是一種面向連接的、提供可靠的、端到端的字節(jié)流傳輸服務(wù)。其頭部結(jié)構(gòu)包括源端口、目標(biāo)端口、序列號(hào)、確認(rèn)應(yīng)答號(hào)等字段。序列號(hào)是在建立連接時(shí)由計(jì)算機(jī)生成的隨機(jī)數(shù)作為初始值,每發(fā)送一次數(shù)據(jù),就累

    2024年02月03日
    瀏覽(26)
  • 【FPGA】Verilog:實(shí)現(xiàn)十六進(jìn)制七段數(shù)碼管顯示 | 7-Segment Display

    【FPGA】Verilog:實(shí)現(xiàn)十六進(jìn)制七段數(shù)碼管顯示 | 7-Segment Display

    寫在前面: 本章主要內(nèi)容為理解七點(diǎn)數(shù)碼管顯示的概念,并使用 Verilog 實(shí)現(xiàn)。生成輸入信號(hào)后通過(guò)仿真確認(rèn)各門的動(dòng)作,通過(guò) FPGA 檢查在 Verilog 中實(shí)現(xiàn)的電路的操作。 七段數(shù)碼管是利用多重輸出功能的非常有用的元件。該元件用于字符化,如十進(jìn)制、十六進(jìn)制數(shù)等。適當(dāng)配

    2024年02月02日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包