c++ - Qt double spin box 在处理值改变时自动填充

标签 c++ qt

我有一个依赖 double 值的耗时计算。为此,我创建了一个 GUI,我可以在其中使用 QDoubleSpinBox 设置计算值。 .双旋转框QDoubleSpinBox::valueChanged(double)信号连接到一个插槽,该插槽使用 QtConcurrent::run 在新线程中启动繁重的计算。 .问题是,当我添加进度条时,双旋转框会在进度条出现时自动填充其内容(零填充直到小数位数)。我的感觉是,这是因为双旋转框失去了焦点(即进度条是选定的小部件)。

我的问题是:

  • 如何显示进度条并制作双旋转框 不用零填充其余的小数位?

This video展示了当进度条未显示时,我可以继续编辑双旋转框,而当显示进度条时,双旋转框用零填充其精度。这是当前的行为,而不是期望的行为。期望的是在计算完成后,双旋转框不会自动用零填充其空的小数位。这是用于视频的代码(在 GitHub 中完全可用):

标题

class DoubleSpinboxHeavyComputation : public QWidget
{
  Q_OBJECT

public:
  explicit DoubleSpinboxHeavyComputation(QWidget *parent = nullptr);
  ~DoubleSpinboxHeavyComputation();

signals:

  void computationDone();

  void progressSignal(int progress_state);

private slots:
  void startHeavyComputationInThread();

  void heavyComputation();

private:
  Ui::DoubleSpinboxHeavyComputation *ui;
  int n_ = 0;
};

实现

DoubleSpinboxHeavyComputation::DoubleSpinboxHeavyComputation(QWidget *parent)
  : QWidget(parent), ui(new Ui::DoubleSpinboxHeavyComputation)
{
  ui->setupUi(this);
  connect(ui->doubleSpinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this,
          &DoubleSpinboxHeavyComputation::startHeavyComputationInThread);
}

DoubleSpinboxHeavyComputation::~DoubleSpinboxHeavyComputation()
{
  delete ui;
}

void DoubleSpinboxHeavyComputation::startHeavyComputationInThread()
{
  if (ui->checkBox->isChecked())
  {
    QProgressDialog *progress = new QProgressDialog("Computing", "", 0, 0, this);
    progress->setWindowTitle(windowTitle());
    progress->setWindowFlags((progress->windowFlags() | Qt::CustomizeWindowHint) &
                             ~Qt::WindowCloseButtonHint);  // Hide close button
    progress->setWindowModality(Qt::WindowModal);
    progress->setCancelButton(nullptr);
    progress->setMaximum(1000);
    progress->show();
    connect(this, &DoubleSpinboxHeavyComputation::progressSignal, progress, &QProgressDialog::setValue);
    connect(this, &DoubleSpinboxHeavyComputation::computationDone, progress, &QProgressDialog::close);
    connect(this, &DoubleSpinboxHeavyComputation::computationDone, progress, &QProgressDialog::deleteLater);
  }
  QtConcurrent::run(this, &DoubleSpinboxHeavyComputation::heavyComputation);
}

void DoubleSpinboxHeavyComputation::heavyComputation()
{
  int current_n = n_;
  ++n_;
  qDebug() << "Start computation " << current_n;
  for (int i = 0; i < 1000; i++)
  {
    emit progressSignal(i);
    usleep(1000);
  }
  qDebug() << "End computation" << current_n;
  emit computationDone();
}

最佳答案

看起来您需要继承QDoubleSpinbox 并重新实现textFromValue 方法

class NumericEdit : public QDoubleSpinBox
{
    Q_OBJECT
public:
    NumericEdit(QWidget *p_parent = nullptr);

    QString textFromValue(double val) const;

};

QString NumericEdit::textFromValue(double val) const
{
    //default converting
//    return QString::number(val);
    //converting with a local representation
    QLocale locale;
    return locale.toString(val);
}

但这会破坏默认的 prefixsuffix 旋转框的功能

关于c++ - Qt double spin box 在处理值改变时自动填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56757781/

相关文章:

Qt:通过项目文件创建目录

c++ - Qt C++ 在按键时播放声音 - 几秒钟后停止工作

c++ - 如何将 URI 列表编码为字符串?

c++ - 关于显式实例化和显式特化的顺序问题

c++ - OpenGL - 将帧缓冲区纹理设置为完全透明

c++ - CUDA中函数指针的问题

c++ - Visual Studio 2010 C++ 中 win32form 上的控制台应用程序输出

python - 在 Arch Linux ARM 中编译 ros-indigo-qt-gui-cpp 时出现的问题

c++ - 如何中止加载程序中的加载组件?

c++ - 什么时候使用虚拟析构函数?