Пример #1
0
class FourthMode(MiddleWidget):
    def __init__(self, obj, name):
        super().__init__(obj, name)
        self._thread = None
        self._obj = obj
        self.name = name
        self.row = 2
        self.set_up()

    def set_up(self):
        middle_widget = QWidget()
        self.middle_layout = QGridLayout()
        middle_widget.setLayout(self.middle_layout)
        for i in range(self.row):
            middle_icon = QLabel(chr(0xf002) + f'目录_{i}:')
            middle_icon.setFont(qtawesome.font('fa', 12))
            middle_icon.setFixedSize(50, self.height)
            middle_input = QLineEdit()
            middle_input.setFixedHeight(self.height)
            middle_input.setObjectName(f'middle_input_{i}')
            middle_btn = QPushButton("…")
            middle_btn.setFixedSize(50, self.height)
            middle_btn.setObjectName(f'middle_btn_{i}')
            middle_btn.setToolTip('点击选择文件')
            middle_btn.clicked.connect(lambda: self.open_file(middle_widget))

            self.middle_layout.addWidget(middle_icon, i, 0, 1, 1)
            self.middle_layout.addWidget(middle_input, i, 1, 1, self.row - 1)
            self.middle_layout.addWidget(middle_btn, i, self.row, 1, 1)

        middle_icon = QLabel(chr(0xf002) + f'目录_{i}:')
        middle_icon.setFont(qtawesome.font('fa', 12))
        middle_icon.setFixedSize(50, self.height)

        self.middle_time = QLineEdit()
        self.middle_time.setFixedHeight(self.height)
        self.middle_time.setObjectName(f'middle_input_{i}')

        btn = QPushButton("选择日期")
        btn.clicked.connect(self.openCalendar)

        self.cal = QCalendarWidget()
        self.cal.setGridVisible(True)  # 是否显示日期之间的网格
        self.cal.setFixedSize(250, 200)
        self.cal.hide()  # 隐藏日期控件
        self.cal.clicked[QDate].connect(
            self.showDate)  # clicked[参数],即定义showDate是传入的参数类型设置

        self.middle_layout.addWidget(middle_icon, 2, 0, 1, 1)
        self.middle_layout.addWidget(self.middle_time, 2, 1, 1, self.row - 1)
        self.middle_layout.addWidget(btn, 2, self.row, 1, 1)
        self.middle_layout.addWidget(self.cal, 3, 1, 1, 1)

        self.middle_layout.setAlignment(Qt.AlignTop)
        self._obj.mid_layout.addWidget(middle_widget, 0, 0, 1, 1)

        set_first_mode_style(middle_widget)
        return True

    def showDate(self, date):
        self.middle_time.setText(date.toString("yyyy-MM-dd dddd"))
        self.cal.close()  # 关闭日期控件

    def openCalendar(self):
        self.cal.show()  # 显示日期控件

    def get_data(self):
        self.children = self.middle_layout.count()
        print(self.children)
        keys = [
            self.middle_layout.itemAt(i).widget().text()
            for i in range(self.children) if not (i % 3)
        ]
        values = [
            self.middle_layout.itemAt(i).widget().text()
            for i in range(self.children) if i % 3 == 1
        ]
        for i in range(self.children // 3):
            input_val = values[i].strip()
            if not input_val:
                continue
            elif not os.path.exists(input_val):
                print("file path error")
                return
            else:
                self.data[keys[i]] = input_val
        return True

    def set_widget_enable(self, flag=False):
        # 禁止btn等
        if flag:
            self.reset_progress()
        else:
            self._obj.tail_btn.setEnabled(True)
        for widget in (self.middle_layout.itemAt(i).widget()
                       for i in range(self.children) if i % 3):
            widget.setDisabled(flag)

    def run(self):
        if not self.get_data():
            raise GetDataError("获取页面路径错误")
        if not self.data:
            print("界面参数不能为空")
            return
        try:
            self.create_thread_run()
        except:
            self.set_widget_enable()
            traceback.print_exc()

    def create_thread_run(self):
        self._thread = MyThread()
        self._thread.sig_str.connect(self.output_log_info)
        self._thread.sig_int.connect(self.set_progress)
        # self._thread.get_data(self.data)
        self._thread.get_obj(self)
        # 线程启动时禁止button和重置进度条
        # 运行后控件禁止再点击
        self.set_widget_enable(True)
        self._thread.start()
Пример #2
0
class ToDoWindow(QWidget):
    def __init__(self, db_accessor):
        super().__init__()
        self.db_accessor = db_accessor  # database delegate
        self.init_ui()

    def init_ui(self):
        self.hBox = QHBoxLayout()
        self.hBox2 = QHBoxLayout()
        self.vBox = QVBoxLayout()

        self.removeBtn = QPushButton()
        self.removeBtn.setText("Remove Selected Tasks")
        self.removeBtn.clicked[bool].connect(self.remove_task)

        self.createBtn = QPushButton()
        self.createBtn.setText("Create Task")
        self.createBtn.setFixedSize(200, 50)
        self.createBtn.clicked[bool].connect(self.create_task)

        self.nameBox = QLineEdit()
        self.nameBox.setPlaceholderText("Task Name")
        self.nameBox.setMaxLength(50)
        self.nameBox.setFixedSize(1185, 50)

        self.descBox = QTextEdit()
        self.descBox.setPlaceholderText("Task Description")
        self.descBox.setFixedSize(600, 500)

        self.calendar = QCalendarWidget()
        self.calendar.setFixedSize(775, 500)

        self.table = QTableView()
        self.table.setFixedSize(1400, 400)

        # stretch columns to fill table's width and load data from database into table
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.update_task_view(self.db_accessor.get_tasks())

        # add widgets to appropriate horizontal layouts
        self.hBox.addWidget(self.createBtn)
        self.hBox.addWidget(self.nameBox)
        self.hBox2.addWidget(self.descBox)
        self.hBox2.addWidget(self.calendar)

        # add horizontal layouts to vertical layout
        # add remove button and table to vertical layout
        self.vBox.addLayout(self.hBox)
        self.vBox.addLayout(self.hBox2)
        self.vBox.addWidget(self.removeBtn)
        self.vBox.addWidget(self.table)

        # Create and display window
        self.setLayout(self.vBox)
        self.setWindowTitle('To-Do')
        self.show()

    # insert a new task into the database and refresh table to reflect insertion
    def create_task(self):
        name = self.nameBox.text().replace("'", "\\'")
        description = self.descBox.toPlainText().replace("'", "\\'")
        date = self.calendar.selectedDate().toString("yyyy-MM-dd")
        self.db_accessor.insert_new_task(name, description, date)
        self.update_task_view(self.db_accessor.get_tasks())

    # refresh table
    def update_task_view(self, result_set):
        model = QStandardItemModel()
        list_of_entries = [list(map(str, elem)) for elem in result_set]
        model.setHorizontalHeaderLabels(self.db_accessor.get_column_names())
        res_rows = list_of_entries
        for row in res_rows:
            model.appendRow(self.get_items_row(row))
        self.table.setModel(model)
        self.table.resizeRowsToContents()
        self.nameBox.setText("")
        self.descBox.setText("")
        self.calendar.setSelectedDate(QDate.currentDate())

    # set the values from the result set into a new row in the model format
    def get_items_row(self, result_row):
        item_row = []
        for val in result_row:
            item = QStandardItem(val)
            item.setEditable(False)
            item_row.append(item)
        return item_row

    def remove_task(self):
        model = self.table.model()

        # get the indeces of the currently selected rows
        indices = [
            elem.row() for elem in self.table.selectionModel().selectedRows()
        ]

        # remove the tasks from the database and refresh table to reflect deletion
        for index in indices:
            name = model.data(model.index(index, 0)).replace("'", "\\'")
            description = model.data(model.index(index, 1)).replace("'", "\\'")
            date = model.data(model.index(index, 2))
            self.db_accessor.delete_task(name, description, date)

        self.update_task_view(self.db_accessor.get_tasks())
Пример #3
0
class DateInputW(QFrame):
    def __init__(self, parent):
        super(DateInputW, self).__init__()
        
        self.layout = QGridLayout()
        self.parent = parent
        
        self.title1 = QLabel(u'Начало:', self)
        self.title1.move(5, 5)
        self.cal1 = QCalendarWidget()
        self.cal1.setGridVisible(True)
        self.cal1.setDateEditEnabled(True)

        self.cal1.clicked.connect(self.setDateStart)
        self.cal1.setFixedSize(200, 160)
        ymd1 = [parent.day_start.year, parent.day_start.month, parent.day_start.day]
        qdate1 = QDate()
        qdate1.setDate(ymd1[0], ymd1[1], ymd1[2])
        self.cal1.setSelectedDate(qdate1)
        
        self.lbl1 = QLabel(self)
        self.lbl1.setText(parent.day_start.strftime('%d/%m/%Y'))
        self.lbl1.move(5, 25)
        
        self.title2 = QLabel(u'Конец:', self)
        self.title2.move(325, 5)
        self.cal2 = QCalendarWidget()
        self.cal2.setGridVisible(True)
        self.cal2.setDateEditEnabled(True)

        self.cal2.clicked.connect(self.setDateEnd)
        self.cal2.setFixedSize(200, 160)
        ymd2 = [parent.day_end.year, parent.day_end.month, parent.day_end.day]
        qdate2 = QDate()
        qdate2.setDate(ymd2[0], ymd2[1], ymd2[2])
        self.cal2.setSelectedDate(qdate2)
        
        self.lbl2 = QLabel(self)
        self.lbl2.setText(parent.day_end.strftime('%d/%m/%Y'))
        self.lbl2.move(325, 25)
        
        self.layout.addWidget(self.cal1, 1, 0)
        self.layout.addWidget(self.cal2, 1, 1)
        
        self.setAutoFillBackground(True)
        palette = self.palette()
        palette.setColor(self.backgroundRole(), QColor('white'))
        self.setPalette(palette)
        
        self.setFrameShape(_frameShape)
        self.setFrameShadow(_frameShadow)
        self.setLineWidth(_lineWidth)
        self.setMidLineWidth(_midLineWidth)
        
        #change NavBar background color
        child = self.cal1.children()[3]
        palette = child.palette()
        palette.setColor(child.backgroundRole(), QColor('silver'))
        child.setPalette(palette)
        
        child = self.cal2.children()[3]
        palette = child.palette()
        palette.setColor(child.backgroundRole(), QColor('silver'))
        child.setPalette(palette)
        
        # change cell color
        brush = self.cal1.paintCell
        
        
        #self.cal1.setWeekdayTextFormat(headerForm)
        
       #parent.layout.addLayout(self.layout, 1, 0, 1, 2)

        

        
    def setDateStart(self):
        date = self.cal1.selectedDate()
        date = date.toPyDate()
        self.parent.day_start = datetime.datetime(date.year, date.month, date.day)
        self.lbl1.setText(self.parent.day_start.strftime('%d/%m/%Y'))
        
        minDate_dt = self.parent.day_start + datetime.timedelta(days=1)
        minDate = QDate()
        minDate.setDate(minDate_dt.year, minDate_dt.month, minDate_dt.day)
        self.cal2.setMinimumDate(minDate)

    def setDateEnd(self):
        date = self.cal2.selectedDate()
        date = date.toPyDate()
        self.parent.day_end = datetime.datetime(date.year, date.month, date.day)
        self.lbl2.setText(self.parent.day_end.strftime('%d/%m/%Y'))
        
        maxDate_dt = self.parent.day_end - datetime.timedelta(days=1)
        maxDate = QDate()
        maxDate.setDate(maxDate_dt.year, maxDate_dt.month, maxDate_dt.day)
        self.cal1.setMaximumDate(maxDate)