1

我有一个显示电影缩略图(子类 qwidgets)的流程布局当我单击缩略图时,通过为其设置样式表(css 边框)将其标记为选中。我想要做的是,如果我 1)单击另一个缩略图,或 2)单击包含 flowlayout 的小部件,它应该被标记为未选中。

我目前已经实现了 mousePressEvent(QMouseEvent *) 方法来在单击缩略图时绘制边框。我不确定如何继续将其标记为未选中。谢谢。

4

3 回答 3

2

我过去做过这样的事情的一种方法是在按钮类中发出一个信号,指示所有其他按钮不被选中。

因此,具有指向所有对象的指针的小部件在其信号之一的信号与其取消选择对象的信号之间建立连接。

以下是您需要的一些骨架类。

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你的subclassedQWidget你中emit iAmClicked()

于 2012-12-10T18:18:00.143 回答
0

我对点的多边形做了类似的事情。当一个人在我的多边形中选择一个点时,我将其着色为绿色并取消选择前一个点(除非他们持有 ctrl)。

为了实现这一点,我有一个管理 QGraphicsItem 来保存我的多边形及其所有点。在单击事件上,它确定选择了哪个点并确定是取消选择还是添加到选择中。

对于您的实现,也许是一个管理 QWidget 类,它包含所有这些缩略图并在将所有点击事件传递给正确的子小部件之前拦截所有点击事件。

于 2012-12-10T18:02:06.680 回答