从列表中的一个QGraphicsItem发送信号到该列表中的所有项目

时间:2018-01-23 11:45:25

标签: python pyqt pyqt4 qgraphicsview qgraphicsitem

背景:我正在尝试制作日历应用。我通过为给定月份中的每个日期安排QGraphicsItemGroup元素来创建月份的自定义视图。所有QGraphicsItemGroup元素都在列表中以便于迭代。当鼠标悬停在某个日期上时,背景会变为灰色。单击日期时,背景将变为蓝色。单击另一个日期时,它将标记为蓝色,并清除上一个日期。

月概述

问题我只希望最后点击的日期有蓝色背景,而不是所有点击的日期。所有其他日期元素应具有白色背景。我无法弄清楚如何将日期列表中的一个QGraphicsItemGroup元素的信号发送到该列表中的所有元素。

当前代码:

<asp:Repeater ID="rptUsers" runat="server">
        <HeaderTemplate>
            <table class="table table-striped table-bordered table-hover" id="UserList">
                <thead>
                    <tr>
                        <th class="hidden">ID</th>
                        <th style="text-align: center">Kullanıcı Adı</th>
                        <th style="text-align: center">Ad</th>
                        <th style="text-align: center">Soyad</th>
                        <th style="text-align: center">IsAdmin</th>
                        <th style="text-align: center">Durum</th>
                        <th style="text-align: center">Rapor Göster</th>
                        <th style="text-align: center">Sil</th>
                    </tr>
                </thead>
                <tbody>
        </HeaderTemplate>
        <ItemTemplate>
            <tr class="<%# Eval("Durum") %>">
                <td class="hidden">
                    <asp:Label ID="lblSira" runat="server" Text='<%# Eval("ID") %>' />
                </td>
                <td style="pointer-events: none; text-align: center">
                    <asp:Label ID="lblKullaniciAdi" runat="server" Text='<%# Eval("KullaniciAdi") %>' />
                </td>
                <td style="pointer-events: none; text-align: center">
                    <asp:Label ID="lblAd" runat="server" Text='<%# Eval("Ad") %>' />
                </td>
                <td style="pointer-events: none; text-align: center">
                    <asp:Label ID="lblSoyad" runat="server" Text='<%# Eval("Soyad") %>' />
                </td>
                <td style="pointer-events: none; text-align: center">
                    <asp:Label ID="lblAdmin" runat="server" Text='<%# Eval("IsAdmin") %>' />
                </td>
                <td style="pointer-events: none; text-align: center">
                    <asp:Label ID="lblDurum" runat="server" Text='<%# Eval("Durum") %>' />
                </td>
                <td>
                    <asp:Button ID="btn_Show" class="btn btn-primary center-block" OnClick="btn_Show_Click" runat="server" Text="Göster" />
                </td>
                <td>
                    <asp:Button ID="btn_Delete" class="btn btn-danger center-block" OnClick="btn_Delete_Click" runat="server" Text="Sil" />
                </td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
            </tbody> </table>
        </FooterTemplate>
    </asp:Repeater>

可能的解决方案:

  1. 在CalendarList类中创建一个信号,该信号可以由DateElement引发,然后触发CalendarList中所有项目的clearBackground方法。

1 个答案:

答案 0 :(得分:0)

CalendarList不是继承自QObject的类,所以它不支持信号,我的回答是通过scene().items()获取项目,然后我们只过滤DateElement类的项目具有真实状态,然后将使用clearRectangle()方法:

def mousePressEvent(self, event):
    for item in self.scene().items():
        if isinstance(item, DateElement):
            if item.status:
                item.clearRectangle()
    self.rectangle.setAcceptHoverEvents(False)
    self.rectangle.setBrush(QBrush(Qt.blue))
    #self.update()