设置比特率类
#ifndef BITRATEBOX_H
#define BITRATEBOX_H
#include <QComboBox>
QT_BEGIN_NAMESPACE
class QIntValidator;
QT_END_NAMESPACE
class BitRateBox : public QComboBox
{
public:
explicit BitRateBox(QWidget *parent = nullptr);
~BitRateBox();
int bitRate() const;
bool isFlexibleDataRateEnabled() const;
void setFlexibleDateRateEnabled(bool enabled);
protected slots:
void checkCustomSpeedPolicy(int idx);
private:
void fillBitRates();
int m_isFlexibleDataRateEnabled;
QIntValidator *m_customSpeedValidator;
};
#endif
设置比特率类实现
#include "bitratebox.h"
#include <QLineEdit>
BitRateBox::BitRateBox(QWidget *parent) :
QComboBox(parent),
m_customSpeedValidator(new QIntValidator(0, 1000000, this))
{
fillBitRates();
connect(this, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &BitRateBox::checkCustomSpeedPolicy);
}
BitRateBox::~BitRateBox()
{
delete m_customSpeedValidator;
}
int BitRateBox::bitRate() const
{
if (currentIndex() == (count() - 1))
return currentText().toInt();
return itemData(currentIndex()).toInt();
}
bool BitRateBox::isFlexibleDataRateEnabled() const
{
return m_isFlexibleDataRateEnabled;
}
void BitRateBox::setFlexibleDateRateEnabled(bool enabled)
{
m_isFlexibleDataRateEnabled = enabled;
m_customSpeedValidator->setTop(enabled ? 10000000 : 1000000);
fillBitRates();
}
void BitRateBox::checkCustomSpeedPolicy(int idx)
{
const bool isCustomSpeed = !itemData(idx).isValid();
setEditable(isCustomSpeed);
if (isCustomSpeed) {
clearEditText();
lineEdit()->setValidator(m_customSpeedValidator);
}
}
void BitRateBox::fillBitRates()
{
const QList<int> rates = {
10000, 20000, 50000, 100000, 125000, 250000, 500000, 800000, 1000000
};
const QList<int> dataRates = {
2000000, 4000000, 8000000
};
clear();
for (int rate : rates)
addItem(QString::number(rate), rate);
if (isFlexibleDataRateEnabled()) {
for (int rate : dataRates)
addItem(QString::number(rate), rate);
}
addItem(tr("Custom"));
setCurrentIndex(6);
}
发送数据帧类
#ifndef SENDFRAMEBOX_H
#define SENDFRAMEBOX_H
#include <QCanBusFrame>
#include <QGroupBox>
#include <QRegularExpression>
#include <QValidator>
QT_BEGIN_NAMESPACE
namespace Ui {
class SendFrameBox; }
QT_END_NAMESPACE
class HexIntegerValidator : public QValidator
{
Q_OBJECT
public:
explicit HexIntegerValidator(QObject *parent = nullptr);
QValidator::State validate(QString &input, int &) const;
void setMaximum(uint maximum);
private:
uint m_maximum = 0;
};
class HexStringValidator : public QValidator
{
Q_OBJECT
public:
explicit HexStringValidator(QObject *parent = nullptr);
QValidator::State validate(QString &input, int &pos) const;
void setMaxLength(int maxLength);
private:
int m_maxLength = 0;
};
class SendFrameBox : public QGroupBox
{
Q_OBJECT
public:
explicit SendFrameBox(QWidget *parent = nullptr);
~SendFrameBox();
signals:
void sendFrame(const QCanBusFrame &frame);
private:
Ui::SendFrameBox *m_ui;
HexIntegerValidator *m_hexIntegerValidator;
HexStringValidator *m_hexStringValidator;
};
#endif
发送数据帧类的实现
#include "sendframebox.h"
#include "ui_sendframebox.h"
enum {
MaxStandardId = 0x7FF,
MaxExtendedId = 0x10000000
};
enum {
MaxPayload = 8,
MaxPayloadFd = 64
};
HexIntegerValidator::HexIntegerValidator(QObject *parent) :
QValidator(parent),
m_maximum(MaxStandardId)
{
}
QValidator::State HexIntegerValidator::validate(QString &input, int &)
{
bool ok;
uint value = input.toUInt(&ok, 16);
if (input.isEmpty())
return Intermediate;
if (!ok || value > m_maximum)
return Invalid;
return Acceptable;
}
void HexIntegerValidator::setMaximum(uint maximum)
{
m_maximum = maximum;
}
H