2016-08-03 18 views
0

これはQt QGraphicsScene add and delete linesの続きです。私はそれをすることができると思ったが、私はできない。ウィンドウが表示されますが、何度チェック/チェックを外しても、軸は一度しか表示されず、隠れたりトグルしたりすることはありません。彼らは最初の "オン"チェックの後に滞在します。Qt QGraphicsScene軸の表示/非表示

私はqDebug(toggled ? "1" : "0")を追加し、それが正しくtoggledの値は、チェックボックスをすべてのクリックのために10から変更し、その逆を示し、彼らがオンになっている後軸だけにとどまります。私は約1週間前にQtを始めました(そしてC++については約1ヶ月前)、私は何を信じるべきか分かりません。

リンクされた質問では、thugaはループ内でconnect()を使用し、1行だけを処理しますが、1行はトグルされます。私もboolを返して、toggledを返してみましたが、それは同じことです。あたかもsetVisible(false)のように機能しません。ここで

は、私は(あなたが好きで、XY変数を置き換える)持っているものです。

[パブリックスロット]

void plotAxes() 
{ 
    QPen *dashedLine {new QPen(QBrush(Qt::blue), 1, Qt::DashLine)}; 
    QGraphicsLineItem *xAxis {scene->addLine(xMin, 0, xMax, 0, *dashedLine)}; 
    QGraphicsLineItem *yAxis {scene->addLine(yCenter, yMin, yCenter, yMax, *dashedLine)}; 
    bool toggled {axesToggle->isChecked()}; 
    if (!toggled) 
    { 
     xAxis->setVisible(false); 
     yAxis->setVisible(false); 
    } 
    else 
    { 
     xAxis->setVisible(true); 
     yAxis->setVisible(true); 
    } 
    scene->update(); 
} 

axesToggleQCheckBoxであり、そのconnect()機能は次のとおりです。

connect(axesToggle, &QCheckBox::toggled, this, &PlotBox::plotAxes); 

ここで、PlotBoxがクラスです。さらに、boxTogglegridToggleもありますが、これがうまくいかない場合は、先に進むことはできません。


[編集]

より良い私が持っているかを示すためには、ここでアプリのスクリーンショットです: qtapp

それはOctaveのに移った後、簡単なsinc()QGraphicsViewを試みることによって開始しましたstem-プロットの場合、私はQtを練習するために追加し続けました(私はちょうどそれを学んでいます) - 今は奇妙な破線のグリッドラインを無視してください。現在のところ、sinc() settingsスピンボックスの+/-クリック後にプロットを自動的に更新するか、またはPlot styleを選択すると、アンチエイリアスを切り替えるためのキーショートカットが表示され、Ctrl+MouseWheelでズームして正しく表示をリセットできます。だから私はグリッド線の設定を可能にしながら、&グリッドをトグルする可能性を追加すると思った。

私は公的なスロット機能をあきらめて、結果を得ることができました。そして、前の答えでthugaとしてconnect()をしました。これはPlotBox()コンストラクタ内にあります(PlotBoxがクラスです)。

QPen *dashedLine {new QPen(QBrush(Qt::blue), 1, Qt::DashLine)}; 
QGraphicsLineItem *xAxis {scene->addLine(xMin, 0, xMax, 0, *dashedLine)}; 
QGraphicsLineItem *yAxis {scene->addLine(yCenter, yMin, yCenter, yMax, *dashedLine)}; 
connect(axesToggle, &QCheckBox::toggled, [=](bool toggled){xAxis->setVisible(toggled); yAxis->setVisible(toggled)}); 

、それは XY変数は(int a {value}のように)単純な値ですが、彼らはsinc() settings spinboxesに依存している場合にのみ機能します。私はNを設定するのにorderN = orderSet->value()を使用します。これは、例えばxy変数の計算に使用されます。したがって、私はプロットに変更を加えなければ、上記はうまくいくでしょう。

私は彼らがsinc() settingsと同期してなりたい場合は、私はこのようにそれを行う必要があります。

orderN = static_cast<short>(orderSet->value()); 
spacingS = static_cast<short>(spacingSet->value()); 
plotHeight = static_cast<short>(heightSet->value()); 
int xMin {-spacingS}; 
int xMax {orderN*spacingS}; 
int yMin {plotHeight>>2}; 
int yMax {-plotHeight}; 
double yCenter {(orderN-1)*spacingS*0.5}; 
QPen *dashedLine {new QPen(QBrush(Qt::blue), 1, Qt::DashLine)}; 
QGraphicsLineItem *xAxis {scene->addLine(xMin, 0, xMax, 0, *dashedLine)}; 
QGraphicsLineItem *yAxis {scene->addLine(yCenter, yMin, yCenter, yMax, *dashedLine)}; 
connect(axesToggle, &QCheckBox::toggled, [=](bool toggled){xAxis->setVisible(toggled); yAxis->setVisible(toggled)}); 

これも動作しますが、私はいずれかへの任意の変更を行わない場合にのみ、 sinc() settingsスピンボックスの私がして軸をトグルしようとすると、xMin &が呼び出されたときに、Plot style関数が動的に使用するため、クラッシュします。この結果、値の不一致が発生します。それが唯一のspinboxes値を適応させる必要がある場合

ので、その後、私はこのように、一人で、そのための関数にそれを変換:

connect(axesToggle, &QCheckBox::toggled, [=](bool toggled){plotAxes(toggled);}); 
:私はこのようなconnect()と呼ば

void plotAxes(const bool &toggled) 
{ 
    orderN = static_cast<short>(orderSet->value()); 
    spacingS = static_cast<short>(spacingSet->value()); 
    plotHeight = static_cast<short>(heightSet->value()); 
    int xMin {-spacingS}; 
    int xMax {orderN*spacingS}; 
    int yMin {plotHeight>>2}; 
    int yMax {-plotHeight}; 
    double yCenter {(orderN-1)*spacingS*0.5}; 
    QPen *dashedLine {new QPen(QBrush(Qt::blue), 1, Qt::DashLine)}; 
    QGraphicsLineItem *xAxis {scene->addLine(xMin, 0, xMax, 0, *dashedLine)}; 
    QGraphicsLineItem *yAxis {scene->addLine(yCenter, yMin, yCenter, yMax, *dashedLine)}; 
     xAxis->setVisible(toggled); 
     yAxis->setVisible(toggled); 
     //qDebug(toggled ? "1" : "0"); // this correctly shows "toggled" changing values 
    scene->update(); 
} 

これは上記と同じxAxis->setVisible(toggle)を使用しますが、動作しません。 Axesチェックボックスがチェックされている場合にのみ軸が表示され、次にプロットを変更するまでオンのままになります。その後、再びオンに切り替えることができますが、それだけです。

main.cppは、約370行です。必要な場合は、pastebinに投稿することができます。おそらく最も幼稚なコードですが、私は学んでいます。

答えて

0

IはplotLines()、次いで同様に、必要なすべての他の変数を扱うメンバー関数updateValues()を使用して、xAxisyAxisプライベート変数を作成することによってこの問題を解決するためにプライベートスロット機能plotImpulses()のそれぞれによって呼び出される機能を管理、およびplotSteps()、これの値を再利用し、次にようconnect()を維持する:私だけの値が更新されるようにするために、デフォルトのプロットスタイル(plotImpulses())を呼び出す必要があり、その後、コンストラクタの最後に

connect(axesToggle, \ 
      &QCheckBox::toggled, \ 
      [=](bool toggled) 
      { 
       xAxis->setVisible(toggled); 
       yAxis->setVisible(toggled); 
      }); 

。これはコンストラクタで1回だけ発生するはずです(そうですか?)。今度は、プロットの変更があるときは常に、プロットスタイル関数を通じてupdateValues()が呼び出されます。つまり、軸(+ box + grid)の切り替えはスピンボックスからの最新の更新値で行われます。私はそれが私のやり方であるか、どのくらいのオーバーヘッドや最適化の余地があるかわからないので、提案は大歓迎です。