最近私は自分のハードウェア用のデバッガを作成しています。 eclipseやqtの作成者や他のIDEのようなメモリビューアウィジェットを追加したいと思います。しかし、私はどのような種類のウィジェットを使うのか分かりません。QTで自分自身のメモリビューアを実現する方法
0
A
答えて
2
最良のオプションは、タスクがプライベートで、ウィジェットのどれもが収納されていないので、カスタムウィジェットを作成することです。たとえば、tableWidgetは、いくつかの設定は、このようにそれを作ることがありますタスクに
これをQAbstractScrollAreaから継承し、このクラスからQTableView、QListView、QListWidget、QTableWidgetを継承します。 QScrollArea内にデータを表示するように設計されています。 さらに、このクラスのdocumentationはカスタムクラスを作成する方法を教えてくれます。
- がその動きを追跡し、その範囲、値、ページのステップ、および を設定することで、スクロールバーを制御します。QAbstractScrollAreaを継承する場合
は、次の操作を行う必要があります。
- スクロールバーの値に従って、 ビューポートに領域の内容を描画します。
- viewportEvent()内のビューポートによって受信された イベントを処理します。
- 特にサイズ変更イベント。 ビューポートの内容を更新するには、viewport-> update()を使用してください。すべてのペイント操作がビューポート上で行われるため、update()の が代わりに使用されます。
memoryviewer.h
#ifndef MEMORYVIEWER_H #define MEMORYVIEWER_H #include <QAbstractScrollArea> #include <QBuffer> class MemoryViewer : public QAbstractScrollArea { Q_OBJECT public: MemoryViewer(QWidget *parent = 0); ~MemoryViewer(); void setData(const QByteArray &ba); bool setData(QIODevice &device); protected: void paintEvent(QPaintEvent *); void resizeEvent(QResizeEvent *); private: void adjustContent(); void init(); int addressWidth(); int hexWidth(); int asciiWidth(); QByteArray data(qint64 pos=0, qint64 count=-1); int nBlockAddress; int mBytesPerLine; int pxWidth; int pxHeight; qint64 startPos; qint64 endPos; int nRowsVisible; QBuffer buffer; QIODevice *ioDevice; qint64 size; QByteArray dataVisible; QByteArray dataHex; }; #endif // MEMORYVIEWER_H
memoryviewer.cpp
#include "memoryviewer.h" #include <QPainter> #include <QScrollBar> MemoryViewer::MemoryViewer(QWidget *parent):QAbstractScrollArea(parent) { ioDevice = new QBuffer(this); init(); connect(verticalScrollBar(), &QScrollBar::valueChanged, this, &MemoryViewer::adjustContent); connect(horizontalScrollBar(), &QScrollBar::valueChanged, this, &MemoryViewer::adjustContent); } MemoryViewer::~MemoryViewer() { } void MemoryViewer::init() { nBlockAddress = 2; mBytesPerLine = 16; pxWidth = fontMetrics().width(QChar('0')); pxHeight = fontMetrics().height(); } int MemoryViewer::addressWidth() { return (nBlockAddress*4+ nBlockAddress -1)*pxWidth; } int MemoryViewer::hexWidth() { return (mBytesPerLine*3+1)*pxWidth; } int MemoryViewer::asciiWidth() { return (mBytesPerLine*2 +1)*pxWidth; } QByteArray MemoryViewer::data(qint64 pos, qint64 count) { QByteArray buffer; if (pos >= size) return buffer; if (count < 0) count = size; else if ((pos + count) > size) count = size - pos; if(ioDevice->open(QIODevice::ReadOnly)){ ioDevice->seek(pos); buffer = ioDevice->read(count); ioDevice->close(); } return buffer; } void MemoryViewer::setData(const QByteArray &ba) { buffer.setData(ba); setData(buffer); } bool MemoryViewer::setData(QIODevice &device) { ioDevice = &device; bool ok = ioDevice->open(QIODevice::ReadOnly); if(ok){ size = ioDevice->size(); ioDevice->close(); } else{ QBuffer *buf = new QBuffer(this); ioDevice = buf; } init(); adjustContent(); return ok; } void MemoryViewer::resizeEvent(QResizeEvent *) { adjustContent(); } void MemoryViewer::paintEvent(QPaintEvent *) { QPainter painter(viewport()); int offsetX = horizontalScrollBar()->value(); int y = pxHeight; QString address; painter.setPen(viewport()->palette().color(QPalette::WindowText)); for(int row = 0; row <= dataVisible.size()/mBytesPerLine; row++){ QString str = QString("%1").arg(startPos + mBytesPerLine*row, nBlockAddress*4, 16, QChar('0')).toUpper(); int i = 0; address = ""; while(i < nBlockAddress){ address += str.mid(i*4, 4) + ":"; i++; } address.remove(address.size()-1, 1); painter.drawText(pxWidth/2 -offsetX , y, address); y+=pxHeight; } int x; int lx = addressWidth() +pxWidth; painter.drawLine(lx-offsetX, 0, lx-offsetX, height()); lx += pxWidth/2; y = pxHeight; //hex data x = lx-offsetX+3*pxWidth; int w = 3*pxWidth; for(int col =0; col < mBytesPerLine/2; col++){ painter.fillRect(x-pxWidth/2, 0, w, height(), viewport()->palette().color(QPalette::AlternateBase)); x+= 6*pxWidth; } int bPos = 0; for(int row=0; row < nRowsVisible; row++){ x = lx-offsetX; for(int col =0; (col < mBytesPerLine) && (bPos < dataHex.size()) ; col++){ QString str = dataHex.mid(bPos*2,2).toUpper(); painter.drawText(x, y, str); x += 3*pxWidth; bPos += 1; } y+= pxHeight; } lx = addressWidth() + hexWidth(); painter.drawLine(lx-offsetX, 0, lx-offsetX, height()); lx += pxWidth/2; bPos = 0; y = pxHeight ; int ch; for(int row=0; row < nRowsVisible; row++){ x = lx-offsetX; for(int col =0; (col < mBytesPerLine) && (bPos < dataVisible.size()) ; col++){ ch = (uchar)dataVisible.at(bPos); if (ch < 0x20) ch = '.'; painter.drawText(x, y, QChar(ch)); x += 2*pxWidth; bPos += 1; } y+= pxHeight; } } void MemoryViewer::adjustContent() { int w = addressWidth() + hexWidth() + asciiWidth(); horizontalScrollBar()->setRange(0, w - viewport()->width()); horizontalScrollBar()->setPageStep(viewport()->width()); nRowsVisible = viewport()->height()/pxHeight; int val = verticalScrollBar()->value(); startPos = (qint64)val*mBytesPerLine; endPos = startPos + nRowsVisible*mBytesPerLine -1; int lineCount = size/mBytesPerLine; verticalScrollBar()->setRange(0, lineCount-nRowsVisible); verticalScrollBar()->setPageStep(nRowsVisible); if(endPos >= size){ endPos = size-1; } dataVisible = data(startPos, endPos-startPos + mBytesPerLine +1); dataHex = dataVisible.toHex(); viewport()->update(); }
アドバ:その参照を取る
は
私は、次のウィジェットを作成しました実装では、QIODevice
から継承するオブジェクト、たとえばQFile
を渡し、メモリオーバーヘッドを排除してビューに必要なときにデータを読み込むことができるため、すべてのバイトを直接ロードする必要はありません。さらに、次のではQByteArray
を渡すことができlink、あなたの質問は何ですか
+0
本当に本当にありがとうございます。私の言葉を超えて〜 –
関連する問題
- 1. 自分自身
- 2. 私は自分自身のデザインウェブサイトをwhmcsにリンクする方法
- 3. 自分自身を送信するフォームの作成方法
- 4. Laravel:自分自身にページを送信する方法
- 5. 自分自身を削除するスクリプト
- 6. JAVA Log4j:独自のパラメータで自分自身の関数を書く方法
- 7. Titan Graphデータベースで頂点のインデックスを自分自身で設定する方法
- 8. 自分自身を繰り返さない方法(DRY)
- 9. linux(Makefile)で自分自身の動的ライブラリを使用する方法
- 10. 自分自身を返すRubyメソッド
- 11. 私自身のスタイルで自分のwysiwygエディタを作る方法は?
- 12. スレッドは自分自身とメインスレッドで実行シーケンス
- 13. 自分自身を初期化するオブジェクトを解放する方法
- 14. 自分自身のPHP mvcフレームワークのhtaccess
- 15. 自分自身のディレクトリ内のUnauthorizedAccessException
- 16. ノードでJavaで自分自身のキューを構築する
- 17. Java - 自分自身を閉じて自分のソフトウェアカーネルパニックなどの自分自身を再起動するにはどうすればいいですか?
- 18. Objective-Cブロックと自分自身をキャプチャ
- 19. 自分自身への参照wsdl url
- 20. Spring MVC +自分自身のセキュリティモデル
- 21. 自分自身の「並べ替え」ボタン
- 22. クラスは自動的に自分自身の友人ですか?
- 23. サーバに自分自身のアクセストークン/秘密を保存する適切な方法
- 24. チャットボットで私自身の声を実現する
- 25. 自分自身を呼び出す関数をユニットテストする方法
- 26. ログインフォーム自分自身に戻ってリダイレクト
- 27. 自動的にコミットを削除する方法Gitで自分自身をキャンセルするコミット
- 28. Signature Verifierが自分自身でチェックするとfalseを返す
- 29. 私自身の自動増分フィールドを割り当てる方法は?
- 30. Linux C - プログラムが自分自身を更新する能力を実装する
例を見つけるでしょう、あなたは、第一または第二の画像を取得したいですか? – eyllanesc
2つの質問:1:最初の画像を取得します。 2 2番目のイメージのようなウィンドウを実現しましたが、2番目のイメージのようにテキストの色を変更する方法を理解していません –
質問は独立しているので、パートごとに質問することをお勧めします。 – eyllanesc