20

関数呼び出しclang-formatをスキップするようにツールを構成する方法はありますか? Qt::connect私のコンストラクタには、次のような接続がいくつかあります。

connect( m_Job, SIGNAL( error( const QString&, const QString& ) ),  this, SLOT( onError( const QString&, const QString& ) ) );
connect( m_Job, SIGNAL( message( const QString& ) ),                this, SLOT( onMessage( const QString& ) ) );
connect( m_Job, SIGNAL( progress( int, int ) ),                     this, SLOT( onProgress( int, int ) ) );

しかし、書式設定ツールを実行すると、読みにくくなります。

connect( m_Job, SIGNAL( error(const QString&, const QString&)), this, SLOT( onError(const QString&, const QString&)) );
connect( m_Job, SIGNAL( message(const QString&)), this, SLOT( onMessage(const QString&)) );
connect( m_Job, SIGNAL( progress(int, int)), this, SLOT( onProgress(int, int)) );
4

3 に答える 3

39

// clang-format offとを使用し// clang-format onて、コード セクションをスキップします。

// clang-format off
// Don't touch this!
connect( m_Job, SIGNAL( error( const QString&, const QString& ) ),  this, SLOT( onError( const QString&, const QString& ) ) );
connect( m_Job, SIGNAL( message( const QString& ) ),                this, SLOT( onMessage( const QString& ) ) );
connect( m_Job, SIGNAL( progress( int, int ) ),                     this, SLOT( onProgress( int, int ) ) );
// clang-format on
// Carry on formatting
于 2015-10-21T11:52:33.243 に答える
1

余談ですが、シグナル/スロット署名を正規化する必要があります。したがって、参照と const-references は必要ありません。Qt 内の署名の正規化コードは単にそれらを削除します。の場合、3 番目のパラメーターも必要ありませんthis

コードは次のようになります。

connect(m_Job, SIGNAL(error(QString,QString)), SLOT(onError(QString,QString)));
connect(m_Job, SIGNAL(message(QString)), SLOT(onMessage(QString)));
connect(m_Job, SIGNAL(progress(int,int)), SLOT(onProgress(int,int)));

あなたが主張するなら、正規化コードはもはやノーオペレーションではないので、もちろんいくらかのランタイムコストで、パラメータタイプの間にスペースが存在する可能性があります。

QMetaObject::connectSlotsByName明示的な接続を取り除くために活用することもできます。これにはm_Jobが の子でありthis、名前があることが必要です。例えば:

class Foo : public Q_OBJECT {
  Job m_job;
  Q_SLOT void on_job_error(const QString&, const QString&);
  Q_SLOT void on_job_message(const QString&);
  Q_SLOT void on_job_progress(int, int);
public:
  Foo(QObject * parent = 0) :
    QObject(parent),
    m_job(this)
  {
    m_job.setObjectName("job");
    QMetaObject::connectSlotsByName(this);
  }
};

パターンを持つ名前のスロットは、on_name_signalによって自動的に接続されconnectSlotsByNameます。はname送信側オブジェクトsignalの名前で、シグナルの名前です。

最後に、空白が多すぎると、コードが読みにくくなるだけでなく、読みにくくなる可能性があります。これはスタイルの問題ではなく、単純な生理学の問題です。中心窩の直径は約 2 度です。視野角の 1 度は、腕を伸ばしたときの親指の幅に相当します。余分な空白を含むコードを読むには、コード行に沿って中心的な視野を再配置するために、より多くのサッカード/凝視が必要です。図 0.15 ~ 0.2 秒は、凝視ごとの価値のあるデータを処理し、それを読んでいるコードのメンタル モデルと統合するために必要でした。それはすべて測定可能です。

医学的なアドバイスではなく、逸話として: 鼻に +0.5 のメガネがないと、密度の高い楽譜を読むことができません。私の視力はそれ以外は完全に正常です。YMMV。

于 2015-10-21T14:53:21.013 に答える
0

読みやすくするために、新しいシグナルスロット構文を使用できます。その外観ははるかに単純です

connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue);

于 2015-10-21T11:35:10.997 に答える