如何从QListWidgetItem获取按钮信号,该信号是使用setItemWidget设置的?如何删除不带空格的QListWidgetItem?

问题描述 投票:0回答:1

简介:

我有listWidget,其中包含QListWidgetItem。在每个按钮上,我都有3个按钮。 “关闭”必须完全销毁QListWidgetItem,推迟必须暂时关闭,但将在下一个计时器超时时出现。因此,我必须将其保存到列表中或将其隐藏。在Designer中创建的UI部件。

图像:

enter image description here

已经尝试:

我已经尝试过@pyqtSlot(QListWidgetItem) def on_itemClicked(self, item),但是单击按钮时不会发出信号-仅在单击项目本身时才发出。即使单击该项目,它也会关闭,但它仍然具有QListWidgetItem的“小部件框架”,并且仍可以通过单击来访问。因此它不会关闭QListWidgetItem,而是关闭inst_pop_up。

图像:

enter image description here

我使用eventFilter找到了解决方案,但没有弄清楚如何在Python中正确设置它。我试图从它的“关闭”按钮关闭onePopUp(取消注释在这里看到:self.pushButton_close.clicked.connect(self.close)),但是它也留下了“小部件框架”。popupMain实例在MainWindow类的init中启动:

self.pop_up_main = popupMain()

在MainWindow类中调用的Timer:

   self.pop_up_main.slot_add_new()
   self.pop_up_main.show()

问题出在onePopUp或popupMain中

popup.py

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUi

class onePopUp(QWidget):
    def __init__(self):
        counter = 0
        super(onePopUp, self).__init__(parent=None)
        loadUi('one_pop_up.ui', self)
        # self.setAttribute(Qt.WA_DeleteOnClose, on=True)
    # self.pushButton_close.clicked.connect(self.close)

    def closeEvent(self, event):
        print('onePopUp : close event')
    # super().close()

class popupMain(QDialog):
    def __init__(self):
        super(popupMain, self).__init__(parent=None)
        loadUi('master_pop_up.ui', self)
        self.listWidget.itemPressed.connect(self.on_itemClicked)
        # Set up the user interface from Designer.
        self.pushButton_add_extra_record.clicked.connect(self.slot_add_new)
        # self.installEventFilter()
        self.list_of_postponed_items = list()
    @pyqtSlot(QListWidgetItem)
    def on_itemClicked(self, item):
        print('in on_itemClicked')
        print('item is {}'.format(item))
        # i = self.listWidget.item(item)
        self.listWidget.removeItemWidget(item)

    # def eventFilter(self, object, event):
    #
    # if event:
    #       print(event, repr(event))
    #       if object == self.dateEdit_date_of_record and event.type() == QMouseEvent.MouseButtonDblClick:
    #           print('dblclick!!!')
    #           self.dateEdit_date_of_record.setDisabled(False)
    #   return super(DialogAddItemRecords, self).eventFilter(object, event)

    def slot_add_new(self):
        print('im in slot_add_new')
        # Creating  a new list widget item whose parent is the listwidget itself
        # QListWidgetItem * listWidgetItem = new QListWidgetItem(ui->listWidget);
        list_widget_item = QListWidgetItem(self.listWidget)
        list_widget_item.setFlags(list_widget_item.flags() & ~Qt.ItemIsSelectable)
        # list_widget_item.setFlags(list_widget_item.flags() & ~Qt.ItemIsSelectable)

        # Adding the item to the listwidget
        # ui->listWidget->addItem(listWidgetItem);
        self.listWidget.addItem(list_widget_item)
        # Creating an object of the designed widget which is to be added to the listwidget
        # TheWidgetItem * theWidgetItem = new TheWidgetItem;
        inst_pop_up = onePopUp()
        inst_pop_up.timeEdit.setTime(QTime.currentTime().addSecs(-15 * 60))
        inst_pop_up.timeEdit_2.setTime(QTime.currentTime())
        # Making sure that  the listWidgetItem has the same size as the TheWidgetItem
        # listWidgetItem->setSizeHint(theWidgetItem->sizeHint());
        list_widget_item.setSizeHint(inst_pop_up.frameSize())
        # print(inst_pop_up.dockWidget.testAttribute())
        inst_pop_up.label_header.setText('test')
        # Finally adding the itemWidget to  the list
        # ui->listWidget->setItemWidget(listWidgetItem, theWidgetItem);
        self.listWidget.setItemWidget(list_widget_item, inst_pop_up)
    # self.listWidget.addItem(list_widget_item, inst_pop_up)

# def slot_delete_item(self):
#   list_widget_item = QListWidgetItem(self.listWidget)
# removeItemWidget

# popup_list_widget = QListWidget()
# one_pop_up_1 = onePopUp()
# popup_list_widget.addItem(one_pop_up_1)

def popup_main():
    app = QApplication(sys.argv)
    window = popupMain()
    window.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    popup_main()

// master_pop_up.ui

<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>481</width>
    <height>203</height>
   </rect>
  </property>
  <property name="font">
   <font>
    <family>Segoe UI</family>
    <pointsize>12</pointsize>
   </font>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <layout class="QHBoxLayout" name="horizontalLayout">
     <item>
      <widget class="QPushButton" name="pushButton">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="text">
        <string/>
       </property>
       <property name="icon">
        <iconset>
         <normaloff>icons/application-sidebar-list.png</normaloff>icons/application-sidebar-list.png</iconset>
       </property>
       <property name="iconSize">
        <size>
         <width>24</width>
         <height>24</height>
        </size>
       </property>
       <property name="flat">
        <bool>true</bool>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="pushButton_add_extra_record">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="text">
        <string>Add extra record</string>
       </property>
       <property name="icon">
        <iconset>
         <normaloff>icons/plus.png</normaloff>icons/plus.png</iconset>
       </property>
       <property name="iconSize">
        <size>
         <width>24</width>
         <height>24</height>
        </size>
       </property>
       <property name="flat">
        <bool>true</bool>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="pushButton_postpone_all">
       <property name="text">
        <string>Postpone all</string>
       </property>
       <property name="icon">
        <iconset>
         <normaloff>icons/alarm-clock-big_24_24.png</normaloff>icons/alarm-clock-big_24_24.png</iconset>
       </property>
       <property name="iconSize">
        <size>
         <width>24</width>
         <height>24</height>
        </size>
       </property>
       <property name="flat">
        <bool>true</bool>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="pushButton_close_all">
       <property name="text">
        <string>Close all</string>
       </property>
       <property name="icon">
        <iconset>
         <normaloff>icons/cross.png</normaloff>icons/cross.png</iconset>
       </property>
       <property name="iconSize">
        <size>
         <width>24</width>
         <height>24</height>
        </size>
       </property>
       <property name="flat">
        <bool>true</bool>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="pushButton">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="text">
        <string/>
       </property>
       <property name="icon">
        <iconset>
         <normaloff>icons/gear.png</normaloff>icons/gear.png</iconset>
       </property>
       <property name="iconSize">
        <size>
         <width>24</width>
         <height>24</height>
        </size>
       </property>
       <property name="flat">
        <bool>true</bool>
       </property>
      </widget>
     </item>
    </layout>
   </item>
   <item>
    <widget class="QListWidget" name="listWidget">
     <property name="acceptDrops">
      <bool>false</bool>
     </property>
     <property name="sizeAdjustPolicy">
      <enum>QAbstractScrollArea::AdjustToContents</enum>
     </property>
     <property name="editTriggers">
      <set>QAbstractItemView::NoEditTriggers</set>
     </property>
     <property name="tabKeyNavigation">
      <bool>true</bool>
     </property>
     <property name="showDropIndicator" stdset="0">
      <bool>false</bool>
     </property>
     <property name="dragDropMode">
      <enum>QAbstractItemView::NoDragDrop</enum>
     </property>
     <property name="defaultDropAction">
      <enum>Qt::IgnoreAction</enum>
     </property>
     <property name="alternatingRowColors">
      <bool>true</bool>
     </property>
     <property name="selectionMode">
      <enum>QAbstractItemView::SingleSelection</enum>
     </property>
     <property name="horizontalScrollMode">
      <enum>QAbstractItemView::ScrollPerItem</enum>
     </property>
     <property name="movement">
      <enum>QListView::Static</enum>
     </property>
     <property name="isWrapping" stdset="0">
      <bool>false</bool>
     </property>
     <property name="resizeMode">
      <enum>QListView::Adjust</enum>
     </property>
     <property name="uniformItemSizes">
      <bool>true</bool>
     </property>
     <property name="selectionRectVisible">
      <bool>true</bool>
     </property>
     <property name="sortingEnabled">
      <bool>true</bool>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

// one_pop_up.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>373</width>
    <height>114</height>
   </rect>
  </property>
  <property name="font">
   <font>
    <family>Segoe UI</family>
    <pointsize>12</pointsize>
   </font>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <property name="locale">
   <locale language="English" country="Germany"/>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QFrame" name="frame">
     <property name="sizePolicy">
      <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
       <horstretch>0</horstretch>
       <verstretch>0</verstretch>
      </sizepolicy>
     </property>
     <property name="minimumSize">
      <size>
       <width>0</width>
       <height>48</height>
      </size>
     </property>
     <property name="styleSheet">
      <string notr="true">font: 12pt &quot;Segoe UI&quot;;</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <layout class="QHBoxLayout" name="horizontalLayout_2">
      <item>
       <widget class="QLabel" name="label_header">
        <property name="font">
         <font>
          <family>Segoe UI</family>
          <pointsize>12</pointsize>
          <weight>50</weight>
          <italic>false</italic>
          <bold>false</bold>
         </font>
        </property>
        <property name="styleSheet">
         <string notr="true"/>
        </property>
        <property name="text">
         <string>TextLabel</string>
        </property>
       </widget>
      </item>
      <item>
       <spacer name="horizontalSpacer_3">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>40</width>
          <height>20</height>
         </size>
        </property>
       </spacer>
      </item>
      <item>
       <widget class="QPushButton" name="pushButton_postpone">
        <property name="minimumSize">
         <size>
          <width>0</width>
          <height>0</height>
         </size>
        </property>
        <property name="text">
         <string>Postpone</string>
        </property>
        <property name="icon">
         <iconset>
          <normaloff>icons/alarm-clock-blue_24_24.png</normaloff>icons/alarm-clock-blue_24_24.png</iconset>
        </property>
        <property name="iconSize">
         <size>
          <width>16</width>
          <height>16</height>
         </size>
        </property>
        <property name="autoDefault">
         <bool>false</bool>
        </property>
        <property name="flat">
         <bool>true</bool>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="pushButton_close">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="font">
         <font>
          <family>Segoe UI</family>
          <pointsize>12</pointsize>
          <weight>50</weight>
          <italic>false</italic>
          <bold>false</bold>
         </font>
        </property>
        <property name="text">
         <string>Close</string>
        </property>
        <property name="icon">
         <iconset>
          <normaloff>icons/prohibition.png</normaloff>icons/prohibition.png</iconset>
        </property>
        <property name="iconSize">
         <size>
          <width>16</width>
          <height>16</height>
         </size>
        </property>
        <property name="flat">
         <bool>true</bool>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
   </item>
   <item>
    <widget class="QFrame" name="">
     <property name="sizePolicy">
      <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
       <horstretch>0</horstretch>
       <verstretch>0</verstretch>
      </sizepolicy>
     </property>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <widget class="QLabel" name="label_23">
        <property name="text">
         <string>From</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QTimeEdit" name="timeEdit">
        <property name="enabled">
         <bool>true</bool>
        </property>
        <property name="wrapping">
         <bool>false</bool>
        </property>
        <property name="frame">
         <bool>true</bool>
        </property>
        <property name="readOnly">
         <bool>true</bool>
        </property>
        <property name="buttonSymbols">
         <enum>QAbstractSpinBox::NoButtons</enum>
        </property>
        <property name="keyboardTracking">
         <bool>false</bool>
        </property>
       </widget>
      </item>
      <item>
       <spacer name="horizontalSpacer_2">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
        <property name="sizeType">
         <enum>QSizePolicy::Fixed</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>5</width>
          <height>20</height>
         </size>
        </property>
       </spacer>
      </item>
      <item>
       <widget class="QLabel" name="label">
        <property name="text">
         <string>to</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QTimeEdit" name="timeEdit_2">
        <property name="enabled">
         <bool>true</bool>
        </property>
        <property name="frame">
         <bool>true</bool>
        </property>
        <property name="readOnly">
         <bool>true</bool>
        </property>
        <property name="buttonSymbols">
         <enum>QAbstractSpinBox::NoButtons</enum>
        </property>
        <property name="keyboardTracking">
         <bool>false</bool>
        </property>
        <property name="showGroupSeparator" stdset="0">
         <bool>false</bool>
        </property>
       </widget>
      </item>
      <item>
       <spacer name="horizontalSpacer">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>40</width>
          <height>20</height>
         </size>
        </property>
       </spacer>
      </item>
      <item>
       <widget class="QPushButton" name="pushButton_add">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="text">
         <string>Add</string>
        </property>
        <property name="icon">
         <iconset>
          <normaloff>icons/arrow-curve.png</normaloff>icons/arrow-curve.png</iconset>
        </property>
        <property name="iconSize">
         <size>
          <width>24</width>
          <height>24</height>
         </size>
        </property>
        <property name="flat">
         <bool>true</bool>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
   </item>
   <item>
    <widget class="Line" name="line">
     <property name="orientation">
      <enum>Qt::Horizontal</enum>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

我必须做什么?

  1. 我必须区分哪个按钮发送了信号。
    • 关闭(按钮“关闭”)
    • 采用QListWidget临时形式('Postpone')
    • 从另一个类MainWindow.add_record(#在此widgetItem上带有时间段的调用方法(按钮'添加记录')]
  2. 此外,我还必须进行延迟(按钮“全部推迟”)并关闭popupMain按钮上的所有按钮(“全部关闭”)。但是我什至不知道一件一件事情能做得热...附言我到处冲浪,但不知道该怎么做!
python pyqt pyqt5
1个回答
0
投票

我已经知道如何去做。我使用了元组列表,该列表连接了itemlistWidget和one_pop_up实例。我还使用了基本的takeItem。它运作完美。我使用hide来推迟该项目。

class onePopUp(QWidget):
    def __init__(self):
        counter = 0
        super(onePopUp, self).__init__(parent=None)
        loadUi('one_pop_up.ui', self)
        self.timeEdit.setTime(QTime.currentTime().addSecs(-15 * 60))
        self.timeEdit_2.setTime(QTime.currentTime())

        self.pushButton_postpone.clicked.connect(self.postpone_event)
        self.pushButton_close.clicked.connect(self.close_event)
        self.pushButton_add.clicked.connect(self.add_recordEvent)
    def postpone_event(self):
        print('in postpone_event at onePopUp')
        print(self.sender())
        print('_________out postpone_event at onePopUp')
        return self.sender()
    def close_event(self):
        print('onePopUp : close event')
        print('end_________onePopUp : close event')
        return self.sender()
    def add_recordEvent(self):
        print('in add_recordEvent at onePopUp')
        print(self.sender())
        print('_________out add_recordEvent at onePopUp')
        return self.sender()

class popupMain(QDialog):
    def __init__(self, main_window=None):
        super(popupMain, self).__init__(parent=None)
        loadUi('master_pop_up.ui', self)
        self.address_of_main_window = main_window
        self.list_of_tuples_item_widget = list()
        self.pushButton_show_main_window.clicked.connect(self.slot_show_main_window)
        self.pushButton_postpone_all.clicked.connect(self.slot_postpone_all)
        self.pushButton_add_extra_record.clicked.connect(self.slot_add_new)
        self.pushButton_close_all.clicked.connect(self.slot_close_all)
    def slot_show_main_window(self):
        self.hide()
    def slot_postpone_all(self):
        j = 0
        while j < self.listWidget.count():
            item_to_unhide = self.listWidget.item(j)
            print(item_to_unhide)
            item_to_unhide.setHidden(True)
            j += 1
    def slot_close_all(self):
        j = 0
        while j < self.listWidget.count():
            print(j, self.listWidget.count())
            item_to_unhide = self.listWidget.item(j)
            print(item_to_unhide)
            # if not item_to_unhide.isHidden:
            i = self.listWidget.takeItem(j)
            print('i={}'.format(i))
            # j += 1
    def slot_add_new(self):
        log('im in slot_add_new')
        self.hide()
        j = 0
        while j < self.listWidget.count():

            item_to_unhide = self.listWidget.item(j)
            print(item_to_unhide)
            if item_to_unhide.isHidden:
                item_to_unhide.setHidden(False)
            j += 1
        # Creating  a new list widget item whose parent is the listwidget itself
        # QListWidgetItem * listWidgetItem = new QListWidgetItem(ui->listWidget);
        list_widget_item = QListWidgetItem(self.listWidget)
        list_widget_item.setFlags(list_widget_item.flags() & ~Qt.ItemIsSelectable)
        # list_widget_item.setFlags(list_widget_item.flags() & ~Qt.ItemIsSelectable)
        # Adding the item to the listwidget
        # ui->listWidget->addItem(listWidgetItem);
        self.listWidget.addItem(list_widget_item)
        # Creating an object of the designed widget which is to be added to the listwidget
        # TheWidgetItem * theWidgetItem = new TheWidgetItem;
        inst_pop_up = onePopUp()
        # inst_pop_up.timeEdit.setTime(QTime.currentTime().addSecs(-15 * 60))
        # inst_pop_up.timeEdit_2.setTime(QTime.currentTime())
        inst_pop_up.pushButton_postpone.pressed.connect(self.button_postpone_pressed_slot)
        inst_pop_up.pushButton_close.clicked.connect(self.button_close_pressed_slot)
        inst_pop_up.pushButton_add.pressed.connect(self.button_add_pressed_slot)
        # Making sure that  the listWidgetItem has the same size as the TheWidgetItem
        # listWidgetItem->setSizeHint(theWidgetItem->sizeHint());
        list_widget_item.setSizeHint(inst_pop_up.frameSize())
        # print(inst_pop_up.dockWidget.testAttribute())
        inst_pop_up.label_header.setText('test')
        # Finally adding the itemWidget to  the list
        # ui->listWidget->setItemWidget(listWidgetItem, theWidgetItem);
        self.listWidget.setItemWidget(list_widget_item, inst_pop_up)
        self.list_of_tuples_item_widget.append((list_widget_item, inst_pop_up))
        print('list_widget_item, inst_pop_up = {}, {}'.format(list_widget_item, inst_pop_up))
        self.show()
    def button_postpone_pressed_slot(self):
        print('in button_postpone_pressed_slot at popupMain')
        item = None
        # print(self.sender())
        pointer_to_widget = self.sender().parent().parent()
        print(pointer_to_widget)
        for list_item in self.list_of_tuples_item_widget:
            if list_item[1] == pointer_to_widget:
                item = list_item[0]
        print('item is {}'.format(item))
        item.setHidden(True)
        print('_________out of button_postpone_pressed_slot at popupMain')
    def button_close_pressed_slot(self):
        print('in button_close_pressed_slot at popupMain')
        item = None
        # print(self.sender())
        pointer_to_widget = self.sender().parent().parent()
        print(pointer_to_widget)
        for list_item in self.list_of_tuples_item_widget:
            if list_item[1] == pointer_to_widget:
                item = list_item[0]
        print('item is {}'.format(item))
        row = self.listWidget.row(item)
        print('row={}'.format(row))
        i = self.listWidget.takeItem(row)
        print('i={}'.format(i))
        print('__________out of button_close_pressed_slot at popupMain')
    def button_add_pressed_slot(self):
        print('in button_add_pressed_slot at popupMain')
        onePopUp_instance = self.sender().parent().parent()
        print(onePopUp_instance)
        time_range_arg = dict(time_start=onePopUp_instance.timeEdit.time(),
                              time_end=onePopUp_instance.timeEdit_2.time())
        self.address_of_main_window.add_item_records(time_range=time_range_arg)
        print('_______out of button_add_pressed_slot at popupMain')

© www.soinside.com 2019 - 2024. All rights reserved.