简介:
我有listWidget
,其中包含QListWidgetItem
。在每个按钮上,我都有3个按钮。 “关闭”必须完全销毁QListWidgetItem
,推迟必须暂时关闭,但将在下一个计时器超时时出现。因此,我必须将其保存到列表中或将其隐藏。在Designer中创建的UI部件。
图像:
已经尝试:
我已经尝试过@pyqtSlot(QListWidgetItem) def on_itemClicked(self, item)
,但是单击按钮时不会发出信号-仅在单击项目本身时才发出。即使单击该项目,它也会关闭,但它仍然具有QListWidgetItem
的“小部件框架”,并且仍可以通过单击来访问。因此它不会关闭QListWidgetItem
,而是关闭inst_pop_up。
图像:
我使用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 "Segoe UI";</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>
widgetItem
上带有时间段的调用方法(按钮'添加记录')]popupMain
按钮上的所有按钮(“全部关闭”)。但是我什至不知道一件一件事情能做得热...附言我到处冲浪,但不知道该怎么做!我已经知道如何去做。我使用了元组列表,该列表连接了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')