我有一个显示电影缩略图的flowlayout(子类qwidgets)。单击缩略图时,通过设置样式表(css边框)将其标记为已选中。我想要做的是,如果我1)单击另一个缩略图,或2)单击包含flowlayout的小部件,它应该被标记为未选中。
我目前已经实现了mousePressEvent(QMouseEvent *)方法,以便在单击缩略图时绘制边框。我不知道如何将其标记为未选中。感谢。
答案 0 :(得分: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的限制。它们具有可用于频繁更改样式的动态属性:
答案 1 :(得分: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
的{{1}}中,您只需subclassedQWidget
答案 2 :(得分:0)
我用点多边形做类似的事情。当一个人选择我的多边形中的一个点时,我将其着色为绿色并取消选择前一个点(除非他们按住ctrl)。
为了达到这个目的,我有一个管理QGraphicsItem,它保存我的多边形及其所有点。在点击事件中,它确定选择了哪个点,并确定是取消选择还是添加到选择。
对于您的实现,可能是一个管理QWidget类,它包含所有这些缩略图并拦截所有点击事件,然后再将它们传递给正确的子窗口小部件。