2011-09-01 10 views
2

複数の項目(テキスト)を含む画面の左側にメニューが必要なアプリケーションに取り組んでいます。表示させたい唯一の項目は、実際のテキストとハイライトバーです。ハイライトバーを次のように変更したいと思います。 a。私はそれをアニメーション化し、ある選択肢から次の選択肢にスライドさせることができます。 b。デフォルトのハイライトカラーの代わりに角を丸めたカスタムピックスマップを使用することができます異なるハイライトバーとスペーシングでQListWidgetをカスタマイズする方法

QListWidgetとスタイルシートを使用して試してみましたが、成功しましたが、ハイライトバーの四隅を丸めることはできませんこの方法。また、私は次の1つの項目からバーの動きをアニメーション化することができますかわからない:

preset_list_view->setStyleSheet("QListView {color: rgb(230, 230, 230); background-color: rgba(0,0,0,0); border-style: none} QListView::item:selected {background-image: url(:/ui_resources/elements-preset_select/highlight_bar_270x30-black_bg.bmp)}"); 

私はすべてオンライン上で見て、あまり見られないました。 QListWidgetのデリゲートを変更することについていくつかの言及がありますが、その説明はあいまいです。これが私のアニメーションの問題を解決するかどうかもわかりません。

アイデア?

+0

あなたが実行することをQML例(QtSDK /例/ 4.7 /宣言型/ modelviews /リストビュー/ highlightranges/QML/highlightranges.qml、で欲しいものに近いものがあります'qmlviewer'で)。基本的に、アニメーション化された透明な選択インジケータがスムーズに動くリストです。 – alexisdm

答えて

1

QLabelsでQDockwidgetを持っていないのはなぜですか?

たとえば、左側の「Qt Designerの 'Widget Box」を見て、それをドラッグして上に置きます。それはあなたが探しているものですか?

ドックウィジェットを必要に応じて移動できます。

+0

これはひどい考えではありませんが、リストから項目を簡単に追加/削除できるようにする必要がありますが、項目が選択されたときに信号を出すだけでなく、私はまた、(ハードウェアボタンからの)信号を受け取ったときに、メニュー内の次または前の項目を選択することができる必要があります。 QListWidgetにはこの機能がすべて含まれているので、必要なものを変更するのが最も簡単だったようです。 –

+0

達成しようとしていることの例やイメージがありますか? – blueskin

+0

こんにちはblueskin、私はそれがクライアントのためであるから私がやっていることの実際のイメージを提供することができないと思う(私はそれが将来オープンソースになると思うが)。表示されるのはリスト内の項目だけで、選択バーはカスタムビットマップであり、選択バーはある項目から次の項目にスライドするQListBoxを表示します。アイテムの数が画面のサイズを超えると、選択したアイテムが変更されるとリストがスクロールします。 –

4

半透明不活性ウィジェットをQListWidgetの上に置き、選択が変更されたときにアニメーション化することができます。 しかし、通常の選択インジケータを無効にするには、代理人が必要です。

作業例:

#include <QListWidget> 
#include <QFrame> 
#include <QPropertyAnimation> 
#include <QStyledItemDelegate> 

class RemoveSelectionDelegate : public QStyledItemDelegate { 
public: 
    RemoveSelectionDelegate(QObject *parent = 0) 
     : QStyledItemDelegate(parent) { 
    } 

    void paint(QPainter *painter, const QStyleOptionViewItem &option, 
       const QModelIndex &index) const { 
     // Call the original paint method with the selection state cleared 
     // to prevent painting the original selection background 
     QStyleOptionViewItemV4 optionV4 = 
      *qstyleoption_cast<const QStyleOptionViewItemV4 *>(&option); 
     optionV4.state &= ~QStyle::State_Selected; 
     QStyledItemDelegate::paint(painter, optionV4, index); 
    } 
}; 

class ListWidget : public QListWidget { 
    Q_OBJECT 
public: 
    ListWidget(QWidget *parent = 0) 
     : QListWidget(parent) 
     , selectionFrame(this) 
     , animation(&selectionFrame, "geometry") { 
     // Create a semi-transparent frame that doesn't interact with anything 
     selectionFrame.setAttribute(Qt::WA_TransparentForMouseEvents); 
     selectionFrame.setFocusPolicy(Qt::NoFocus); 

     // You can put your transparent image in that stylesheet 
     selectionFrame.setStyleSheet("background: solid rgba(0, 0, 125, 25%);"); 
     selectionFrame.hide(); 
     animation.setDuration(250); 
     animation.setEasingCurve(QEasingCurve::InOutBack); 

     connect(this, 
       SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), 
       SLOT(updateSelection(QListWidgetItem*)));   
     setItemDelegate(new RemoveSelectionDelegate(this)); 
    } 

private slots: 
    void resizeEvent(QResizeEvent *e) { 
     QListWidget::resizeEvent(e); 
     updateSelection(currentItem()); 
    } 

    void updateSelection(QListWidgetItem* current) { 
     animation.stop(); 
     if (!current) { 
      selectionFrame.hide(); 
      return; 
     } 
     if (!selectionFrame.isVisible()) { 
      selectionFrame.setGeometry(visualItemRect(current)); 
      selectionFrame.show(); 
      return; 
     } 
     animation.setStartValue(selectionFrame.geometry()); 
     animation.setEndValue(visualItemRect(current)); 
     animation.start(); 
    } 
private: 
    QFrame selectionFrame; 
    QPropertyAnimation animation; 
}; 
+0

alexisdmありがとうございます、私はそれを(私はそれの周りに私の頭をラップしようと数分を過ごす!私は、Qtがこの機能をより簡単な方法で提供していないことに少し失望していますが、誰が完全にフリーソフトウェアについて多くの人に不平を言うのですか? –