QT — Как заставить Clang-формат пропустить разделы кода C ++

Есть ли способ настроить 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)) );

3

Решение

использование // 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
8

Другие решения

Ты можешь использовать новый синтаксис сигнального слота для лучшего чтения. Это выглядит намного проще

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

0

В качестве отступления: вы должны нормализовать сигнатуры / сигнатуры. Таким образом, ссылки и const-ссылки не нужны, код нормализации подписи в Qt просто удаляет их. Вам также не нужен третий параметр, если он 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 это имя сигнала.

Наконец, чрезмерный пробел может сделать ваш код сложнее, а не проще для чтения. Это не вопрос стиля, а простой физиологии. Fovea centralis составляет около 2 угловых градусов в диаметре. Одна угловая степень зрения равна ширине большого пальца на расстоянии вытянутой руки. Чтение кода с чрезмерным пробелом требует большего количества саккад / фиксаций, чтобы переместить ваше центральное видение вдоль строки кода. Рисунок 0.15-0.2s необходим для обработки данных каждой фиксации и их интеграции с вашей ментальной моделью кода, который вы читаете. Это все измеримо.

В качестве анекдота, а не медицинского совета: я не могу читать плотные ноты без +0,5 очков на носу. В остальном мое зрение совершенно нормально. YMMV.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector