微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

QT5.15.2 中的 qspinbox64

如何解决QT5.15.2 中的 qspinbox64

我尝试按照

中的建议创建一个 qspinBox64

64bit int Spin Box in QT

qspinBox64.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

一些旁注:

  1. 你缺少头球后卫 #ifndef QSPINBOX64_H
  2. 构造函数应调用基类构造函数并按照原始帖子中的说明设置最小值/最大值。
  3. 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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?