問題タブ [qstyleditemdelegate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
6277 参照

qt - QTreeView にさまざまな種類のデリゲートを追加する方法

添付図のような QTreeView (QTreeWidget ではない) 構造を作成したい. これが QT のプロパティ エディタです。QT-4.6を使用しています

ここに画像の説明を入力

2 列目では、さまざまな条件に応じて、スピン ボックス、ドロップ ダウン、チェックボックス、テキスト編集などを使用できます。特定の列。ドキュメントから、セルにデリゲートを設定するための直接的な API がないことは明らかです (むしろ、完全なウィジェットまたは行または列で使用できます)。

0 投票する
1 に答える
391 参照

qt - QTableView セルをクリックしてもフォーカスされないのはなぜですか?

QTableViewスライダーを使用して列 2 のセルを編集するデリゲートを作成し、設定しました。openPersistentEditor列 2 のすべてのセルを呼び出します。

これで、列 2 にスライダーが永続的に表示されたテーブルができました。

QStyledItemDelegate のサブクラスでスライダーを作成するために使用するコードは次のとおりです。

私の問題は、ユーザーがスライダーを使用して値を編集しているときを知る必要があることです (フォーカスが必要です)。テーブルのセルから左側のスライダーにタブで移動すると、スライダーが返された現在のアイテムになることがわかりましたが、スライダーtable->selectionModel()->currentIndex();をクリックしても、現在のアイテムは変更されません。また、セルから左側のスライダーにタブで移動することはできますが、スライダーからタブで移動することはできません。

簡単なものが欠けていると確信していますが、助けていただければ幸いです。

重要な場合は、スライダーのコンストラクターで StrongFocus を設定しQModelViewます。スライダーの列のフラグは次のとおりです。Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled;

0 投票する
2 に答える
2602 参照

qt - QStyleOptionButton をカスタム アイコン付きのチェックボックスのように設定する方法

Delegateから継承するカスタムクラスがありQStyledItemDelegateます。そのpaint()場合、チェック可能にする必要があるものを追加したいと思いQStyleOptionButtonます。出来ますか?

たとえば、目のアイコンで可視性プロパティを示します。ボタンを押すと、目のアイコンが閉じた目のアイコンに変わります。

メソッド内でpaint()、これはボタンを作成するための現在のコードです。

にロードするアイコンは、次の方法buttonVisで作成されます。

プログラムを実行すると、ボタンには目を閉じたアイコンが表示されます。どのアイコンを表示するかを制御するコマンドはありますか? 初期のレイアウトを実装できない場合、どの方向に進むべきでしょうか?

編集:チェックボックスの外観をシミュレートするために使用するアイコンを選択する方法を見つけました。代わりに if 行buttonVis.state = QStyle::State_Enabled;があるべきです:

ここでの問題は、その状態が何であるか、または から設定する方法を理解することeditorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)です。option問題は、常に参照しているため、自分で実際に変更できないことです。それを行う方法、またはそれを回避する方法はありますか?

0 投票する
2 に答える
2655 参照

python - QStyledItemDelegate を使用した CustomWidget の QListView

データをより整理する方法を示すQListViewwithを作成しようとしています。QStyledItemDelegate

私はこのサイトを調べましたが、そのすべてが C++ で書かれていますが、投稿で使用されている構文と呼び出しから推測して、それを達成する方法を試しましたが、運がありませんでした。誰かがこれで私を助けてくれますか?

0 投票する
1 に答える
1062 参照

qt - 複数の ProgressBars の進行状況データで TableView を更新する方法は?

接続できるように、 qGetDownloadManagerを拡張してaの進行状況を出力し始めましTransferItemた。TableViewで表示するモデルのセルに進行状況データを挿入していDelegateます。最後にデリゲートが進行状況バーを描画します。それは理論的には機能しますが、私は次のことに遭遇しています

問題:複数のダウンロードが並行して行われている場合、両方のシグナルから両方のセルへの進行状況の更新を取得します。

ここに画像の説明を入力

QModelIndex indexどちらの進行状況バーにも進行状況データが表示されますが、シグナルは混合されており、現在のインデックス ( / )に固有のものではありませんindex.row()

(UserRoles 間の小さな遷移の問題は無視してください (ダウンロード ボタンをクリックした後、"ActionCell" が表示され、"ProgressBar" が表示される前に "Install" が表示されます)。それはここでの主な問題ではありません。私の質問はインデックスに関するものです。問題です。) テキスト "112" と "113" は intindex.rowです。

質問:

  • 複数の ProgressBars の進行状況データで TableView を更新する方法は?
  • ダウンロードごとに進行状況バーを表示するには、何を変更する必要がありますか?

ソース

ダウンロードの進行状況を出力する

クラスを介して信号を再発信するために、次のことを追加しました。信号が上部にバブルアップし、GUI から接続可能になります。

  1. -からQNetworkReply- downloadProgress(qint64,qint64)への接続TransferItemupdateDownloadProgress(qint64,qint64)

    /li>
  2. SLOT 関数TransferItem-updateDownloadProgress(qint64,qint64)レシーバーが進行状況を計算し、progress( QMap<QString, QVariant>) に格納するため。計算後、downloadProgress(this)シグナルが発行されます。

    /li>
  3. 新しいダウンロードがキューに入れられる と、発行さdownloadProgress(this)れた を Slot DownloadManager-に接続していdownloadProgress(TransferItem*)ます。(dlDownloadItem拡張するTransferItem) です。

    /li>
  4. 最後に、ダウンロードの進行状況をもう一度再発行しています。

    /li>

Delegate、doDownload(index)、および ProgressBarUpdater を含む TableView

  1. QTableView
  2. を追加QSortFilterProxyModel(大文字と小文字を区別しないため)
  3. カスタムUserRolesColumnDelegateに基づいて DownloadButton と ProgressBar をレンダリングします。デリゲートはボタンのクリックを処理しますdownloadButtonClicked(index)。SIGNAL はeditorEvent(event, model, option, index)メソッドから発行されます。

    /li>
  4. doDownloadメソッドは を受け取り、indexモデルからダウンロード URL を取得します。次に、URL が DownloadManager に追加され、ProgressBarUpdater オブジェクトを設定して、指定されたインデックスのモデルに進行状況データを設定しています。最後に、に接続downloadManager::signalProgressprogressBar::updateProgressて呼び出しdownloadManager::checkForAllDone、ダウンロード処理を開始します。

    /li>
  5. モデルの更新部分: ProgressBarUpdater はインデックスと進行状況を取得し、指定されたインデックスでモデルを更新する必要があります。

    /li>
  6. レンダリング部分: デリゲートから偽の ProgressBar をレンダリングしています。で進行状況データを取得しindex.model()->data(index, DownloadProgressBarRole)ます。

    /li>

QString::number(index.row()各 ProgressBar の行番号がレンダリングされるように、進行状況バーのテキストに追加しました。言い換えれば、レンダリングは行に固有ですが、入ってくる進行状況データは何らかの形で混合されています。

私はしばらくインデックスの問題で立ち往生しています。よろしくお願いいたします。

更新: 問題は解決しました!

ddriverさん、ありがとうございました!! 私はあなたの提案に従い、それを修正しました:

ここに画像の説明を入力

0 投票する
2 に答える
5857 参照

qt - QStyledItemDelegate:チェックボックスボタンをクリックしてその状態を変更する方法

MyDelegateに使用されるデリゲートがありQListWidgetます。デリゲートは から派生しQStyledItemDelegateます。の目標の 1 つは、 のMyDelegate各行にチェックボックス ボタンを配置することですListWidgetpaint()次のイベント内で実行されますMyDelegate

を指定したので、最初はチェックボックスをクリックすると自動的に状態が変わると思いましたQStyle::CE_CheckBox。しかし、そうではありません。チェックボックスの視覚的な動作を手動で指定する必要があるようです。

データ的には、ユーザーがそのチェックボックスをクリックすると、特定の信号が発せられ、シーン データが変更されます。でこのアクションを実行しますeditorEvent():

バックエンド部分が機能します。ただし、チェックボックスボタンの視覚状態をチェックからチェック解除、およびその逆に変更する方法がわかりません。

paint()から次のようなことを行うことで、チェックボックスの状態を手動で変更できることに気付きました。

QStyle::State_On/Offチェックボックスの状態を手動で変更するトリックを行います。

しかし、それを設定する方法と、どこに設定すればよいかわかりませんsomeConditionboolチェックボックス領域がクリックされたときに設定されるプライベート変数として導入しようとしましたeditorEvent()が、目的の動作を生成しません。他のすべてのチェックボックスをListWidget同じ視覚状態に設定します。そのため、すべてのチェックボックスのグローバル条件のように動作しました。

私の仕事を達成するには、ボタンを再実装し、クリック時にチェックボックスの状態を変更する必要があるように感じます。しかし、私はこの方法で迷子になり、問題へのアプローチ方法がわかりません。QStyleOptionButtonAPIからは、clicked()使用できるメソッドやその他のメソッドが表示されません。

問題は、チェックボックスを視覚的にチェックボックスのように動作させるにはどうすればよいかということです。チェックボックスを再実装する必要がある場合、どのクラスを継承すればよいでしょうか?

0 投票する
1 に答える
2333 参照

python - QCompleter のポップアップ リストのリスト項目を適切にフォーマットする方法は?

ユーザーが文字を入力し、特定のデータ ソース (リストはこちら) に基づいて検索を容易にする提案を取得できる小さなユーザー インターフェイスを作成する方法を調査したいと考えています。この目的のために、Qt のQCompleterクラスを使用しています。

一致する要素では、入力された文字は、次のコードの例のように HTML で強調表示されますAu<b>st</b>ria。最後に、いくつかの SO の回答 ( Qt でアイテム ビューをリッチ (html) テキストでレンダリングする方法を参照) とチュートリアルを小さなスタンドアロン モジュールにマージしました。

私の問題は、回答https://stackoverflow.com/a/5443112/1504082でのユーザー Timo の提案です。

行: 'doc.setHtml(options.text)' の後、doc.setTextWidth(option.rect.width()) も設定する必要があります。そうしないと、デリゲートはターゲット描画領域に関して長いコンテンツを正しくレンダリングしません。たとえば、QListView で単語をラップしません。

したがって、コンプリータのポップアップで長いテキストがトリミングされるのを避けるためにこれを行いました。しかし、次の出力が得られます。 この縦の余白はどこから来るのでしょうか?

この追加の垂直マージンはどこから来るのでしょうか?

これを少し調べたところ、属性を持つ四角形を含むパラメーターを使用して のsizeHintメソッドがHTMLDelegate呼び出されることがあることがわかりました。そして、 の呼び出し後に最終的に表示動作が変わります。しかし、このパラメーターを使用して誰がそれを呼び出しているのか、そしてこれを適切に修正する方法を最終的に見つけることができませんでした。options(0, 0, 0, 0)doc.setTextWidth(options.rect.width())

誰かがこれがどこから来たのか、どうすればこれを適切に修正できるのかを説明できますか?

0 投票する
0 に答える
561 参照

qt - QTreeView に行の高さを再計算させる方法は?

QTreeViewサブクラスQAbstractItemModelとカスタムがありますQStyledItemDelegate。カスタム デリゲートがsizeHint再実装され、テキストの折り返しを考慮して、計算された正しいセルの高さが返されます。

したがって、問題は、列のサイズ変更時にセルの高さが変化しないことです。QTreeView彼のセルの高さを強制的に再計算する方法は? シグナルを使用QHeaderView::sectionResizedしてセルのサイズ変更を検出できますが、QTreeViewセルの高さを変更するにはどうすればよいですか?