问题描述
我尝试按照
中的建议创建一个 qspinBox64qspinBox64.h
#define QSPINBox64_H
#include <QtGui>
#include <QtWidgets>
namespace Ui {
class QSpinBox64;
}
class QSpinBox64Private;
class Q_WIDGETS_EXPORT QSpinBox64 : public QAbstractSpinBox//QSpinBox
{
Q_OBJECT
Q_PROPERTY(int64_t minimum READ minimum WRITE setMinimum)
Q_PROPERTY(int64_t maximum READ maximum WRITE setMaximum)
Q_PROPERTY(int64_t value READ value WRITE setValue NOTIFY valueChanged USER true)
int64_t m_minimum;
int64_t m_maximum;
int64_t m_value;
public:
explicit QSpinBox64(QWidget *parent = nullptr)
{
connect(lineEdit(),SIGNAL(textEdited(QString)),this,SLOT(onEditFinished()));
}
~QSpinBox64()
{
}
int64_t value() const
{
return m_value;
}
int64_t minimum() const
{
return m_minimum;
}
int64_t maximum() const
{
return m_maximum;
}
void setMinimum(int64_t min)
{
m_minimum = min;
}
void setMaximum(int64_t max)
{
m_maximum = max;
}
void setRange(int64_t min,int64_t max)
{
setMinimum(min);
setMaximum(max);
}
virtual void stepBy(int steps)
{
auto new_value = m_value;
if (steps < 0 && new_value + steps > new_value) {
new_value = std::numeric_limits<qlonglong>::min();
}
else if (steps > 0 && new_value + steps < new_value) {
new_value = std::numeric_limits<qlonglong>::max();
}
else {
new_value += steps;
}
lineEdit()->setText(textFromValue(new_value));
setValue(new_value);
}
protected:
virtual qvalidator::State validate(QString &text,int &pos) const
{
//return validator->validate(text,pos);
bool ok;
int64_t val = text.toLongLong(&ok);
if (!ok)
return qvalidator::Invalid;
if (val < m_minimum || val > m_maximum)
return qvalidator::Invalid;
return qvalidator::Acceptable;
}
virtual int64_t valueFromText(const QString &text) const
{
bool ok;
return text.toLongLong(&ok,10);
}
virtual QString textFromValue(int64_t value) const
{
return QString::number(value,10).toupper();
}
virtual QAbstractSpinBox::StepEnabled stepEnabled() const;
public
Q_SLOTS:
void setValue(int64_t val)
{
if (m_value != val) {
lineEdit()->setText(textFromValue(val));
m_value = val;
}
}
void onEditFinished()
{
QString input = lineEdit()->text();
int pos = 0;
if (qvalidator::Acceptable == validate(input,pos))
setValue(valueFromText(input));
else
lineEdit()->setText(textFromValue(m_value));
}
Q_SIGNALS:
void valueChanged(int64_t v);
private:
Ui::QSpinBox64 *ui;
Q_disABLE_copY(QSpinBox64)
Q_DECLARE_PRIVATE(QSpinBox64)
};
#endif
main.cpp
#include <QHBoxLayout>
#include "qspinBox64.h"
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QSpinBox64 spinBox;
spinBox.setwindowTitle(QObject::tr("QSpinBox64"));
spinBox.show();
return app.exec();
}
编译后出现错误:
G:\proj\build-qspinBox64-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug\debug\moc_qspinBox64.cpp:141:
error: C2491: 'QSpinBox64::staticMetaObject': deFinition of dllimport static data member not allowed
我应该怎么做才能避免这个错误?
解决方法
罪魁祸首是Q_WIDGETS_EXPORT
,定义在qtwidgetsglobal.h
# if defined(QT_BUILD_WIDGETS_LIB)
# define Q_WIDGETS_EXPORT Q_DECL_EXPORT
# else
# define Q_WIDGETS_EXPORT Q_DECL_IMPORT
# endif
您应该通过将此行添加到 .pro 文件中来在您的项目中声明 QT_BUILD_WIDGETS_LIB
DEFINES += QT_BUILD_WIDGETS_LIB
一些旁注:
- 你缺少头球后卫
#ifndef QSPINBOX64_H
- 构造函数应调用基类构造函数并按照原始帖子中的说明设置最小值/最大值。
-
stepEnabled()
需要实施
explicit QSpinBox64(QWidget *parent = nullptr) : QAbstractSpinBox{parent}
{
setMaximum(std::numeric_limits<int64_t>::max());
setMinimum(std::numeric_limits<int64_t>::min());
connect(lineEdit(),SIGNAL(textEdited(QString)),this,SLOT(onEditFinished()));
}
virtual QAbstractSpinBox::StepEnabled stepEnabled() const
{
return QAbstractSpinBox::StepUpEnabled | QAbstractSpinBox::StepDownEnabled;
}