2016-06-12 7 views
2

PyQt5を使用してlicense wizardのチュートリアルに従っており、非線形ウィザードを作成する方法を学習しています。しかし、私は問題に固執しているようです。コンテンツの変更に基づいて、QWizardPageからFinishを動的に追加/削除します

QComboBoxのページがあります。ここで選択された項目は、コンボボックスを含む現在のQWizardPageが最終ページかどうかを判断します。ここで

ページは、これまで含まれているものです:

class CalibrationPageSource(QWizardPage): 
    def __init__(self, parent): 
     super(CalibrationPageSource, self).__init__(parent) 
     self.setTitle('Calibration Wizard') 
     self.setSubTitle('Select the source for the calibration') 

     layout = QVBoxLayout() 
     label = QLabel(''' 
      <ul> 
       <li><b>From calibration file</b>: browse and select an existing YAML calibration file that contains the camera matrix and distortion coefficients (for example from a previous calibration)</li> 
       <li><b>From image files</b>: browse and select one or more image files with the calibration pattern visible inside each</li> 
       <li><b>From stream</b> - if the calibration node is connected to an active <b><i>Device node</i></b> you can use its image stream to interactively calibrate your device</li> 
      </ul> 
     ''') 
     label.setWordWrap(True) 
     layout.addWidget(label) 

     layout_sources = QHBoxLayout() 
     label_sources = QLabel('Source:') 
     self.selection_sources = QComboBox() 
     self.selection_sources.addItem('Calibration file') 
     self.selection_sources.addItem('Image files') 
     self.selection_sources.addItem('Stream') 
     self.selection_sources.currentIndexChanged['QString'].connect(self.source_changed) 
     self.selection_sources.setCurrentIndex(1) 
     layout_sources.addWidget(label_sources) 
     layout_sources.addWidget(self.selection_sources) 
     layout.addLayout(layout_sources) 

     self.setLayout(layout) 

    @pyqtSlot(str) 
    def source_changed(self, source): 
     if source == 'Calibration file': 
      self.setFinalPage(True) 
      # TODO Add file dialog 
     else: 
      self.setFinalPage(False) 
      # TODO Remove file dialog (if present) 

たび私は、ページが最終作りで、ウィザードの残りの部分を省略したいと思いますCalibration fileからself.selection_sourcesの現在の項目が変更されます。この場合、Nextボタンを削除します。それ以外の場合は(現在は2つしかありません:Image filesStream)、ウィザードを正常に動作させて、最終ページにしないようにします。

私は、カスタムisComplete(...)を実装しようとしているが、問題はCalibration fileが選択されている場合、それはNextFinishの両方を無効にしていることです。私は無効なNextボタン(それを完全に隠すのではなく)を持って生きることができますが、無効のFinishは私の場合は基本的に意味をなさない。私は実際にはNextボタンがあることに驚いています。最後のページに達したときに完全に離れていないのでしょうか?

どのようにこの問題を解決するためのアイデアですか?私はQWizardPageの項目を反復し、手動でNextボタンを無効にしたり隠したりすることを考えましたが、これを行うための簡単ですぐ使える方法があることを願っています。現在の状態ではFinishの動的挿入が機能していますが、Nextボタンのためにウィザードの移行が正しく設定されていません。

答えて

0

コードでは、すでにQWizardPage.setFinalPage(True)を使用して中間ページに終了ボタンを追加しています。今度はまだ次のボタンがあります。これを削除する1つの方法(これが最善の方法であるかどうかわからない場合)はと一緒にQWizard.removePage()を呼び出すことによって、以降のすべてのページを削除しています。

例:この例では

from PyQt5.QtWidgets import * 

def end_wizard_after_page_two(): 
    # add finish button to wizard 
    p2.setFinalPage(True) 
    # remove all over buttons 
    while True: 
     id = w.nextId() 
     if id == -1: 
      break 
     w.removePage(id) 

app = QApplication([]) 

# page 1 
p1 = QWizardPage() 
p1.setTitle('Page 1') 

# page 2 
p2 = QWizardPage() 
p2.setTitle('Page 2') 

b = QPushButton('No further pages') 
b.clicked.connect(end_wizard_after_page_two) 
l = QVBoxLayout(p2) 
l.addWidget(b) 

# page 3 
p3 = QWizardPage() 
p3.setTitle('Page 3') 

# wizard 
w = QWizard() 
w.addPage(p1) 
w.addPage(p2) 
w.addPage(p3) 
w.show() 

app.exec_() 

参照方法end_wizard_after_page_two()

エフェクトを逆にしたい場合は、すべてを逆にする必要があります(残りのページをもう一度追加し、setFinalPageをFalseに追加する)。

+0

ニース。できます。私はこれを行うより効率的な方法がないかと思います。今のところ私は答えとしてマークします。ありがとう。 – rbaleksandar

1

これはほぼ1年遅れていますが、問題の原因がわかりました。 setFinalPage(True)に電話すると、QWizardPageに状態フラグが設定されます。 QWizardに自動的には反映されません。

情報を伝播する信号は1つだけです。completeChanged。名前はやや誤解を招くされますが、ドキュメントは、それはあなたが彼らにちょうどを読めば、あなたが何をしたいんことを示しているように見える:

あなたがisComplete()を再実装した場合、確実にするために、isComplete()変化のcompleteChanged()いつでも値を放出するようにしてくださいQWizardはボタンの有効または無効の状態を更新します。実際に

、同じ問題に遭遇した、私は、太字のラインが新しい

 
if source == 'Calibration file': 
    self.setFinalPage(True) 
    ... 
else: 
    self.setFinalPage(False) 
    ... 
self.completeChanged.emit() 

をすることによってそれを修正することができました。どちらの場合でも呼び出す必要があり、ボタンを「次へ」から「終了」に切り替えて、別のオプションを選択すると戻ってきます。

関連する問題