1

映画のサムネイル (サブクラス化された qwidgets) を表示するフローレイアウトがあります。サムネイルをクリックすると、スタイルシート (css ボーダー) を設定することで選択済みとしてマークされます。私がやりたいことは、1) 別のサムネイルをクリックするか、2) フローレイアウトを保持するウィジェットをクリックすると、未選択としてマークする必要があることです。

現在、サムネイルがクリックされたときに境界線を描画するために mousePressEvent(QMouseEvent *) メソッドを実装しました。未選択としてマークする方法がわかりません。ありがとう。

4

3 に答える 3

2

私が過去にそのようなことをした方法は、他のすべてのボタンを選択解除するように信号を送るボタンクラスで信号を作成することです。

そのため、すべてのオブジェクトへのポインターを持つウィジェットは、1 対 1 のシグナルのシグナルと、オブジェクトの選択を解除するシグナルとを接続します。

必要なスケルトン クラスを次に示します。

class Button
{
signals:
    void selected(Button *);
slot:
    void deselect(Button *);
}

class ButtonContainer
{
public:
    void addButton(Button *)
signals:
    void buttonSelected(Button *);
}

ボタンを追加するときは、次の方法でコンテナに接続します。

QObject::connect(button, SIGNAL(selected(Button *)), 
                 buttonContainer, SIGNAL(buttonSelected(Button *)));
QObject::connect(buttonContainer, SIGNAL(buttonSelected(Button *)), 
                 button, SLOT(deselect(Button *)));

マウス プレス イベントが発生すると、「選択した」スタイルシートを適用した後に次の信号を送信します。

emit selected(this);

選択解除スロットにこれを入れます:

void Button::deselect(Button * selectedButton)
{
    if(this != selectedButton)
    {
        // apply stylesheet for deselecting if it was previously selected
    }
}

それが役立つことを願っています。

ところで、スタイルシートをあまり頻繁に設定していないことを確認してください。大規模なテストは行っていませんが、Qt の少なくとも一部のバージョンでは、QList の制限を超える可能性があります。これらには、頻繁にスタイルを変更するために使用できる動的プロパティがあります。

QList: メモリ不足

于 2012-12-10T18:17:48.827 に答える
2

現在選択されているウィジェットへのリンクをどこかに保存し、他のウィジェットを選択するときに選択を解除できます。このようなもの:

someClass::someClass():
activeWidget(0)
{
    for(......)
    {
        subclassedQWidget *w = new subclassedQWidget(this);
        // ......
        // ......
        QObject::connect(w, SIGNAL(iAmClicked()), this, SLOT(someoneClicked()))
    }

}

someClass::someoneClicked()
{
    subclassedQWidget *caller = (subclassedQWidget*)QObject::sender();
    if (caller == activeWidget) {return;} //Do nothing when active widget clicked
    if (activeWidget) activeWidget->unSelect();
    if (caller)
    {
        caller->select();
        activeWidget = caller;
    }
}

mousePressEventあなたの中subclassedQWidgetemit iAmClicked()

于 2012-12-10T18:18:00.143 に答える
0

ポイントのポリゴンで同様のことを行います。人がポリゴン内のポイントを選択すると、緑色に色付けし、前のポイントの選択を解除します (ctrl を保持していない限り)。

これを実現するために、ポリゴンとそのすべてのポイントを保持する QGraphicsItem を管理しています。クリックイベントでは、どのポイントが選択されたかを判断し、選択を解除するか選択に追加するかを決定します。

あなたの実装では、これらのサムネイルをすべて保持し、正しいサブウィジェットに渡す前にすべてのクリックイベントをインターセプトする管理 QWidget クラスが考えられます。

于 2012-12-10T18:02:06.680 に答える