0

モデルとデータの関係がどうあるべきかを理解しようとしています。

ここに画像の説明を入力


私の現在の状況では、アクティブなソケットのリストを保持する QTcpServer があります。

class TftpServer : public QTcpServer
{
    Q_OBJECT
public:
    TftpServer(QObject *parent = 0)
        :QTcpServer(parent) {}
    QList<QTcpSocket *> m_activeSockets;

モデルがビューに表すデータはQList<QTcpSocket *> m_activeSockets;

それを行う正しい方法は、不整合につながる可能性があるため、データの重複を何としてでも防止することだと思います。つまり、ビューは常に実際の状態のデータを表す必要があります。

私はいくつかのアプローチを試しましたが、各アプローチのテストに費やす時間が限られているため、成功しませんでした。

アプローチ:

1.

TftpServer::m_activeSocketsプライベート、モデルはゲッターとセッターを介してアクセスします。

  • TftpServer::m_activeSockets欠陥:モデル内からメソッドを呼び出す方法は?

2.

のモデルフレンドクラスTftpServer。に直接アクセスしTftpServer::m_activeSocketsます。

  • 実装に失敗しました。

3.

TftpServer::m_activeSockets公衆。モデルには公開参照があります

QList<QTcpSocket *> & m_activeSockets;TftpServer::m_activeSockets

  • 欠陥: 機密データが公開されている

最適な解決策 (お気軽に提案してください) が最適と見なされることを確認したいと思います。

また、単一のデータ ソースに固執しないことの長所を聞いてください (その場合、モデルはTftpServer::m_activeSocketsパラメーターとして のコピーを持ち、変更時にそれと同期します)。

4

1 に答える 1

1

Qt のモデル ビュー アーキテクチャを悪用しています。実際のソケットを渡す必要はありません。必要なのは、接続のリストをモデル化することなので、それを実装するだけです。接続にはいくつかのパラメーターがあります。これらは、モデルの列にマップするか、より便利な方法に応じて、各接続がツリーの親アイテムである子行としてマップできます。モデルが提供するデータは、視覚化に関して意味のあるものでなければなりません。AQTcpSocketは、独自のカスタム ビューまたはデリゲートを作成しない限り、視覚化できるものではありません。視覚化できるものは、数値、文字列などです。

あなたがやろうとしているのはQTcpSocket、ホスト名、ポートなどを返すために使用されるいくつかのアクセサメソッドを持つ構造のみとして再利用することです。そのように乱用しても、時間を節約することはできません。

于 2013-10-31T21:06:48.610 に答える