1

明らかな何かが欠けている場合は申し訳ありませんが、私の質問に対する答えが見つからないようです。どんな助けでも大歓迎です。

QSlider を使用して、作成したクラスのデータを操作しようとしています。

メインウィンドウコンストラクターには、次のものがあります。

connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));

同じクラスでスロットが定義されている場合:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    AFrame *frame;
    Ui::MainWindow *ui;

public slots:
    void setValue(int val)
    {
        frame->setMphValue(val);
    }

};

私のフレームクラスは、設定した画像の上に描画できるようにするための昇格されたウィジェットであり、次のように定義されています。

class AFrame : public QLabel
{
    Q_OBJECT

public:
    AFrame( QWidget *parent );
    void setMphValue(int val) { m_mph = val; }

protected:
    void paintEvent( QPaintEvent *event );

private:
    int m_mph;

};

問題は、AFrame クラスの paintEvent 関数で m_mph 値を割り当てようとすると、整数値が失われることです。

私が行方不明であることは明らかですか?この問題にアプローチするより良い方法はありますか?

そして私のpaintEventコード:

void AFrame::paintEvent(QPaintEvent *event)
{

    QLabel::paintEvent(event);
    QPainter painter(this);

    QPen pen("#FF0099");
    pen.setWidth(8);


    painter.setPen(pen);

    //rpm
    painter.drawLine(250,275,165,165);

    //oil
    painter.drawLine(450,100,400,75);

    //fuel
    painter.drawLine(650,95,600,65);

    //mph

    QRect rec(0,0,125,3);

    int velocity = m_mph;
    int rpmStartVal = -225;
    float mph = velocity * 1.68;

    painter.translate(870,275);
    painter.rotate(rpmStartVal + mph);

    painter.drawRect(rec);


 }
4

2 に答える 2

2

整数値は失われていません。mphウィジェットには、値が更新されたときに再描画する必要があるという事実に対する魔法のような洞察はありません。以下setMphValueのようになります。それだけです。

void setMphValue(int val) {
   m_mph = val;
   update();
}
于 2012-06-04T14:27:53.610 に答える
0

Kuba の返信に追加するには:

valまた、実際には必要ない場合の再描画を避けるために、前と同じ値であるかどうかを確認する必要があります。また、update()後で touchによって呼び出された場合に副作用の無限ループが発生しますsetMphValue()

略さずに:

void setMphValue(int val) {
   if (val == m_mph) return;
   m_mph = val;
   update();
}
于 2014-05-08T09:58:24.423 に答える