def __init__(self, *args): QWidget.__init__(self, *args) # create table list_data = [1,2,3,4] lm = MyListModel(list_data, self) lv = QListView() lv.setModel(lm) # layout layout = QVBoxLayout() layout.addWidget(lv) self.setLayout(layout)
def __init__(self, parent=None): super(Window, self).__init__(parent) model = FileListModel(self) model.setDirPath(QLibraryInfo.location(QLibraryInfo.PrefixPath)) label = QLabel("Directory") lineEdit = QLineEdit() label.setBuddy(lineEdit) view = QListView() view.setModel(model) self.logViewer = QTextBrowser() self.logViewer.setSizePolicy(QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)) lineEdit.textChanged.connect(model.setDirPath) lineEdit.textChanged.connect(self.logViewer.clear) model.numberPopulated.connect(self.updateLog) layout = QGridLayout() layout.addWidget(label, 0, 0) layout.addWidget(lineEdit, 0, 1) layout.addWidget(view, 1, 0, 1, 2) layout.addWidget(self.logViewer, 2, 0, 1, 2) self.setLayout(layout) self.setWindowTitle("Fetch More Example")
class SettingWindow(QWidget): # on_addButtonClicked=pyqtSignal() # on_removeButtonClicked=pyqtSignal() # on_okButtonClicked=pyqtSignal() finished=pyqtSignal() def __init__(self): QWidget.__init__(self) self.listview=QListView(self) self.addButton=QPushButton(self) self.removeButton=QPushButton(self) self.resize(630,440) self.okButton=QPushButton(self) self.listview.setGeometry(30,30,410,351) self.addButton.setGeometry(490,40,80,22) self.addButton.setText("add") self.addButton.clicked.connect(self.click_add) self.removeButton.setGeometry(490,80,80,22) self.removeButton.setText("remove") self.removeButton.clicked.connect(self.click_remove) self.okButton.setGeometry(490,150,80,22) self.okButton.setText("ok") self.okButton.clicked.connect(self.click_ok) # self.aw=null self.fresh() def click_ok(self): self.finished.emit() self.close() def click_add(self): self.aw=AddWindow() self.aw.show() self.aw.okSig.connect(self.fresh) def click_remove(self): self.remove() def fresh(self): confFile=open("conf","r") self.listModel=QStandardItemModel() self.itemList=cPickle.load(confFile) confFile.close() for item in self.itemList: itemView=QStandardItem(QIcon(item.path),item.name) itemView.setEditable(False) self.listModel.appendRow(itemView) self.listview.setModel(self.listModel) def remove(self): index=self.listview.currentIndex().row() self.itemList.pop(index) self.listModel.removeRow(index) confFile=open("conf","w") cPickle.dump(self.itemList,confFile) confFile.close()
def __init__(self, parent=None): QListView.__init__(self, parent) dndView.__init__(self, parent) outlineBasics.__init__(self, parent) self.setResizeMode(QListView.Adjust) self.setWrapping(True) self.setItemDelegate(corkDelegate()) self.setSpacing(5) self.setVerticalScrollMode(self.ScrollPerPixel) self.setFlow(self.LeftToRight) self.setSelectionBehavior(self.SelectRows) self.updateBackground()
class QueryDialog(QDialog): """a dialog to choose an item from a query """ choice = pyqtSignal(str) def __init__(self, query): super().__init__() self.query = query self.create_model() self.init_UI() def create_model(self): """creates the model as QSqlQueryModel, using the given query """ self.model = QSqlQueryModel() q = QSqlQuery() q.exec_(self.query) self.model.setQuery(q) def init_UI(self): """setup the UI """ layout = QVBoxLayout() self.setLayout(layout) self.resize(200,200) self.title = "Choose an existing project" self.list = QListView(self) layout.addWidget(self.list) self.list.setModel(self.model) self.list.setWhatsThis("Choose a project by clicking on it") self.btn = QPushButton("Accept", self) layout.addWidget(self.btn) self.btn.clicked.connect(self.on_btn_clicked) self.btn.setWhatsThis("Click here to accept your selection (works only if a project has been selected)") def on_btn_clicked(self): """when self.btn is clicked, accept the choice and emit it as self.choice """ selected = self.list.selectedIndexes() if selected: index = selected[0] chosen = self.model.data(index, Qt.DisplayRole) self.choice.emit(chosen) self.close() self.choice.emit("") self.close()
def __init__(self, parent=None): super(MDIHistory, self).__init__(parent) self.setMinimumSize(QSize(200, 150)) self.setWindowTitle("PyQt5 editor test example") lay = QVBoxLayout() lay.setContentsMargins(0,0,0,0) self.setLayout(lay) self.list = QListView() self.list.setEditTriggers(QListView.NoEditTriggers) self.list.activated.connect(self.activated) self.list.setAlternatingRowColors(True) self.list.selectionChanged = self.selectionChanged self.model = QStandardItemModel(self.list) self.MDILine = MDILine() self.MDILine.soft_keyboard = False self.MDILine.line_up = self.line_up self.MDILine.line_down = self.line_down STATUS.connect('reload-mdi-history', self.reload) # add widgets lay.addWidget(self.list) lay.addWidget(self.MDILine) self.fp = os.path.expanduser(INFO.MDI_HISTORY_PATH) try: open(self.fp, 'r') except: open(self.fp, 'a+') LOG.debug('MDI History file created: {}'.format(self.fp)) self.reload() self.select_row('last')
def setupWidgets(self): frame = QFrame() frameLayout = QHBoxLayout(frame) self.piecesList = QListView() self.piecesList.setDragEnabled(True) self.piecesList.setViewMode(QListView.IconMode) self.piecesList.setIconSize(QSize(60,60)) self.piecesList.setGridSize(QSize(80,80)) self.piecesList.setSpacing(10) self.piecesList.setMovement(QListView.Snap) self.piecesList.setAcceptDrops(True) self.piecesList.setDropIndicatorShown(True) self.model = PiecesModel(self) self.piecesList.setModel(self.model) self.puzzleWidget = PuzzleWidget() self.puzzleWidget.puzzleCompleted.connect(self.setCompleted, Qt.QueuedConnection) frameLayout.addWidget(self.piecesList) frameLayout.addWidget(self.puzzleWidget) self.setCentralWidget(frame)
def __init__(self, parent=None): super(MDIHistory, self).__init__(parent) self.setMinimumSize(QSize(300, 200)) self.setWindowTitle("PyQt5 editor test example") lay = QVBoxLayout() lay.setContentsMargins(0,0,0,0) self.setLayout(lay) self.list = QListView() self.list.setEditTriggers(QListView.NoEditTriggers) self.list.activated.connect(self.activated) self.list.setAlternatingRowColors(True) self.list.selectionChanged = self.selectionChanged self.model = QStandardItemModel(self.list) self.MDILine = MDILine() self.MDILine.soft_keyboard = False self.MDILine.line_up = self.line_up self.MDILine.line_down = self.line_down # add widgets lay.addWidget(self.list) lay.addWidget(self.MDILine) self.reload()
def initUI(self): #GrBox1 GrBox=QGroupBox() vbox = QHBoxLayout(self) vbox.setContentsMargins(0,0,0,0) #GrBox.setFixedHeight(60) pathButton = QPushButton(QIcon('icons\\pack.png'),"Папка") pathButton.setIconSize(QSize(25,25)) pathButton.setVisible(True) pathLable=QLineEdit() #pathLable.setReadOnly(True) subPathCheck=QCheckBox() subPathCheck.setText("Подпапки") subPathCheck.setCheckState(0) vbox.addWidget(pathLable) vbox.addWidget(subPathCheck) vbox.addWidget(pathButton) GrBox.setLayout(vbox) #/GrBox1 #FilesTable FilesTable=QListView(self) FilesTable.setToolTip("Список файлов, выберите нужные файлы для обработки,\nдля просмотра файла дважды щелкните по нему") FilesTableModel = QStandardItemModel() FilesTable.setModel(FilesTableModel) #/FilesTable #mainLayout mainLayout = QVBoxLayout() mainLayout.setContentsMargins(0,0,0,0) mainLayout.setMenuBar(GrBox) mainLayout.addWidget(FilesTable) #/mainLayout #self self.setLayout(mainLayout) self.path=pathLable.text() self.pathLable=pathLable self.subPathCheck=subPathCheck self.FilesTableModel = FilesTableModel #/self #connections pathLable.textChanged.connect(self.setPath) pathButton.clicked.connect(self.selectPath) subPathCheck.clicked.connect(self.setPath) FilesTableModel.itemChanged.connect(self.ChangeFilesList) FilesTable.doubleClicked.connect(self.openFile)
class ListScrollArea(QVBoxLayout): def __init__(self, parent): QVBoxLayout.__init__(self, parent) self.scroll_area = QScrollArea() # A ListView is a widget, instead of a layout, so there should be no need for additional containers self.list_view = QListView() self.scroll_area.setWidget(self.list_view) self.addWidget(self.list_view) self.view_model = QStringListModel() self.list_view.setModel(self.view_model) def add_item_by_string(self, value): current_values = self.view_model.stringList() if value not in current_values: current_values.append(value) self.view_model.setStringList(current_values) def remove_item_by_string(self, value): current_values = self.view_model.stringList() if value in current_values: current_values.remove(value) self.view_model.setStringList(current_values) def clear_all(self): self.view_model.setStringList([]) def get_currently_selected_item(self): currently_selected_item_index = self.view_model.currentIndex() currently_selected_item_text = str(self.list_view.data(currently_selected_item_index)) return currently_selected_item_text def get_item(self, index): current_values = self.view_model.stringList() if index < len(current_values): return current_values[index] return None def get_num_items(self): return len(self.view_model.stringList())
def __init__(self, parent): super(PatchPanel, self).__init__() self.ola = parent.ola self.parent = parent self.device_selected = None self.universe = None grid = QGridLayout() self.inputs_model = PortList(self, 'input_mode') self.outputs_model = PortList(self, 'output_mode') self.devices = QListView() self.devices_model = DeviceList(self) self.devices.setModel(self.devices_model) self.inputs = QListView() self.inputs.setModel(self.inputs_model) self.inputs.setMinimumHeight(400) self.inputs.setMinimumHeight(120) self.outputs = QListView() self.outputs.setModel(self.outputs_model) self.outputs.setMinimumHeight(400) self.outputs.setMinimumHeight(120) # Universe Selected Change self.devices.selectionModel().selectionChanged.connect(self.device_selection_changed) devices_label = QLabel('Devices') grid.addWidget(devices_label, 0, 0, 1, 1) grid.addWidget(self.devices, 1, 0, 21, 1) inputs_label = QLabel('Inputs') grid.addWidget(inputs_label, 0, 1, 1, 1) grid.addWidget(self.inputs, 1, 1, 10, 1) outputs_label = QLabel('Outputs') grid.addWidget(outputs_label, 11, 1, 1, 1) grid.addWidget(self.outputs, 12, 1, 10, 1) grid.setSpacing(5) self.setLayout(grid)
def __init__(self, qpart, model): QListView.__init__(self, qpart.viewport()) # ensure good selected item background on Windows palette = self.palette() palette.setColor(palette.Inactive, palette.Highlight, palette.color(palette.Active, palette.Highlight)) self.setPalette(palette) self.setAttribute(Qt.WA_DeleteOnClose) self.setItemDelegate(HTMLDelegate(self)) self._qpart = qpart self.setFont(qpart.font()) self.setCursor(QCursor(Qt.PointingHandCursor)) self.setFocusPolicy(Qt.NoFocus) self.setModel(model) self._selectedIndex = -1 # if cursor moved, we shall close widget, if its position (and model) hasn't been updated self._closeIfNotUpdatedTimer = QTimer(self) self._closeIfNotUpdatedTimer.setInterval(200) self._closeIfNotUpdatedTimer.setSingleShot(True) self._closeIfNotUpdatedTimer.timeout.connect(self._afterCursorPositionChanged) qpart.installEventFilter(self) qpart.cursorPositionChanged.connect(self._onCursorPositionChanged) self.clicked.connect(lambda index: self.itemSelected.emit(index.row())) self.updateGeometry() self.show() qpart.setFocus()
def __init__(self, parent=None): self.parent = parent self.parent.statusbar.showMessage("Keep Columns started...") QWidget.__init__(self,parent) self.ui = gui.keepColumnUi() self.ui.setupUi(self) self.columns = [] self.batch_files = filedialog.askopenfilenames(parent=root, title='Choose the file(s) you want to modify') if len(self.batch_files) == 0: self.close() return self.parent.statusbar.showMessage("Checking column validity...") #extract columns for item in self.batch_files: self.columns.append(helpers.extract_columns(item)) #check to see if all columns are equal in all the datasets if not helpers.are_columns_same(self.columns): if not helpers.columns_not_equal_message(self): self.close() return #list of items to check from self.model = QStandardItemModel() try: for col in self.columns[0]: item = QStandardItem(col) item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) item.setData(QVariant(Qt.Unchecked), Qt.CheckStateRole) self.model.appendRow(item) except IndexError: pass self.list = QListView(self) self.list.setModel(self.model) self.list.setGeometry(10, 60, 380, 430) self.ui.removeBtn.clicked.connect(self.keep) self.ui.closeBtn.clicked.connect(self.close) self.parent.statusbar.showMessage("Welcome back!") self.show()
def __init__(self, *args): # Invoke parent init QListView.__init__(self, *args) # Get a reference to the window object self.app = get_app() self.win = args[0] # Get Model data self.title_model = TitlesModel() # Setup header columns self.setModel(self.title_model.model) self.setIconSize(QSize(131, 108)) self.setGridSize(QSize(102, 92)) self.setViewMode(QListView.IconMode) self.setResizeMode(QListView.Adjust) self.setUniformItemSizes(True) self.setWordWrap(True) self.setTextElideMode(Qt.ElideRight) # Refresh view self.refresh_view()
def _setupUi(self): self.setWindowTitle(tr("Re-Prioritize duplicates")) self.resize(700, 400) #widgets msg = tr( "Add criteria to the right box and click OK to send the dupes that correspond the " "best to these criteria to their respective group's " "reference position. Read the help file for more information." ) self.promptLabel = QLabel(msg) self.promptLabel.setWordWrap(True) self.categoryCombobox = QComboBox() self.criteriaListView = QListView() self.addCriteriaButton = QPushButton(self.style().standardIcon(QStyle.SP_ArrowRight), "") self.removeCriteriaButton = QPushButton(self.style().standardIcon(QStyle.SP_ArrowLeft), "") self.prioritizationListView = QListView() self.prioritizationListView.setAcceptDrops(True) self.prioritizationListView.setDragEnabled(True) self.prioritizationListView.setDragDropMode(QAbstractItemView.InternalMove) self.prioritizationListView.setSelectionBehavior(QAbstractItemView.SelectRows) self.buttonBox = QDialogButtonBox() self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok) # layout self.mainLayout = QVBoxLayout(self) self.mainLayout.addWidget(self.promptLabel) self.splitter = QSplitter() sp = self.splitter.sizePolicy() sp.setVerticalPolicy(QSizePolicy.Expanding) self.splitter.setSizePolicy(sp) self.leftSide = QWidget() self.leftWidgetsLayout = QVBoxLayout() self.leftWidgetsLayout.addWidget(self.categoryCombobox) self.leftWidgetsLayout.addWidget(self.criteriaListView) self.leftSide.setLayout(self.leftWidgetsLayout) self.splitter.addWidget(self.leftSide) self.rightSide = QWidget() self.rightWidgetsLayout = QHBoxLayout() self.addRemoveButtonsLayout = QVBoxLayout() self.addRemoveButtonsLayout.addItem(verticalSpacer()) self.addRemoveButtonsLayout.addWidget(self.addCriteriaButton) self.addRemoveButtonsLayout.addWidget(self.removeCriteriaButton) self.addRemoveButtonsLayout.addItem(verticalSpacer()) self.rightWidgetsLayout.addLayout(self.addRemoveButtonsLayout) self.rightWidgetsLayout.addWidget(self.prioritizationListView) self.rightSide.setLayout(self.rightWidgetsLayout) self.splitter.addWidget(self.rightSide) self.mainLayout.addWidget(self.splitter) self.mainLayout.addWidget(self.buttonBox)
def __init__(self, parent): QVBoxLayout.__init__(self, parent) self.scroll_area = QScrollArea() # A ListView is a widget, instead of a layout, so there should be no need for additional containers self.list_view = QListView() self.scroll_area.setWidget(self.list_view) self.addWidget(self.list_view) self.view_model = QStringListModel() self.list_view.setModel(self.view_model)
def mouseDoubleClickEvent(self, event): item = self.indexAt(event.pos()) try: player = str(item.data().toString()) except AttributeError: player = str(item.data()) if player != str(None): self.doubleclickeditem.emit(player) if self.engine: if self.model().dealer: self.setDealer(item, player) else: self.model().removeRows(item.row(), 1) self.changed.emit() return QListView.mouseDoubleClickEvent(self, event)
def init_UI(self): """setup the UI """ layout = QVBoxLayout() self.setLayout(layout) self.resize(200,200) self.title = "Choose an existing project" self.list = QListView(self) layout.addWidget(self.list) self.list.setModel(self.model) self.list.setWhatsThis("Choose a project by clicking on it") self.btn = QPushButton("Accept", self) layout.addWidget(self.btn) self.btn.clicked.connect(self.on_btn_clicked) self.btn.setWhatsThis("Click here to accept your selection (works only if a project has been selected)")
def __init__(self): QWidget.__init__(self) self.listview=QListView(self) self.addButton=QPushButton(self) self.removeButton=QPushButton(self) self.resize(630,440) self.okButton=QPushButton(self) self.listview.setGeometry(30,30,410,351) self.addButton.setGeometry(490,40,80,22) self.addButton.setText("add") self.addButton.clicked.connect(self.click_add) self.removeButton.setGeometry(490,80,80,22) self.removeButton.setText("remove") self.removeButton.clicked.connect(self.click_remove) self.okButton.setGeometry(490,150,80,22) self.okButton.setText("ok") self.okButton.clicked.connect(self.click_ok) # self.aw=null self.fresh()
def __init__(self, parent): QFrame.__init__(self, parent) self.setFrameStyle(QFrame.Box | QFrame.Sunken) self.setStyleSheet("QListView{background:transparent;}") self.listView = QListView(self) self.setLayout(QHBoxLayout()) self.layout().setContentsMargins(0, 0, 0, 0) self.layout().addWidget(self.listView) self.listView.setContextMenuPolicy(Qt.CustomContextMenu) self.listView.setEditTriggers(QAbstractItemView.NoEditTriggers) self.listView.setMovement(QListView.Snap) self.listView.setFlow(QListView.LeftToRight) self.listView.setResizeMode(QListView.Adjust) self.listView.setGridSize(QSize(self.logicalDpiX() / 96 * 70, self.logicalDpiY() / 96 * 70)) self.listView.setViewMode(QListView.IconMode) self.quickDesktopModel = QuickDesktopModel(self.window().platform.databaseFile) self.listView.setModel(self.quickDesktopModel) self.createActions() self.makeConnections()
def __init__(self): super(FlickrViewer, self).__init__() self.logged_in = False self.scaleFactor = 0.0 self.photos = [] self.current_page = 1 self.topLayout = QGridLayout() self.central = QWidget() self.central.setLayout(self.topLayout) self.setCentralWidget(self.central) self.picture_list = QListView() self.photos_model = QStandardItemModel(self.picture_list) self.topLayout.addWidget(self.picture_list,0,0) self.picture_list.setModel(self.photos_model) self.picture_list.clicked.connect(self.on_item_selected) self.detail = QWidget() self.detail_layout = QVBoxLayout() self.detail_thumb = QLabel() self.detail.setLayout(self.detail_layout) self.detail_title = QLabel("Photo Title:") self.detail_embedding = QPlainTextEdit("..") self.detail_layout.addWidget(self.detail_thumb) self.detail_layout.addWidget(self.detail_title) self.detail_layout.addWidget(self.detail_embedding) self.topLayout.addWidget(self.detail,0,1) self.createActions() self.createMenus() self.setWindowTitle("Flickr Viewer") self.resize(500, 400)
def _setupUi(self): self.resize(400, 300) self.gridLayout = QGridLayout(self) self.label = QLabel(tr("Choose a type for this tab:")) self.label.setAlignment(Qt.AlignCenter) self.gridLayout.addWidget(self.label, 0, 0, 1, 3) self.gridLayout.addItem(horizontalSpacer(), 1, 0, 1, 1) self.verticalLayout = QVBoxLayout() BUTTONS = [ ('networthButton', tr("1. Net Worth"), 'balance_sheet_16'), ('profitButton', tr("2. Profit && Loss"), 'income_statement_16'), ('transactionButton', tr("3. Transactions"), 'transaction_table_16'), ('gledgerButton', tr("4. General Ledger"), 'gledger_16'), ('scheduleButton', tr("5. Schedules"), 'schedules_16'), ('budgetButton', tr("6. Budgets"), 'budget_16'), ('docpropsButton', tr("7. Document Properties"), 'gledger_16'), ('pluginlistButton', tr("8. Plugin Management"), ''), ] for i, (name, label, icon) in enumerate(BUTTONS, start=1): button = QPushButton(label) if icon: button.setIcon(QIcon(QPixmap(':/{}'.format(icon)))) self.verticalLayout.addWidget(button) setattr(self, name, button) shortcut = QShortcut(self) shortcut.setKey(QKeySequence(str(i))) shortcut.setContext(Qt.WidgetShortcut) setattr(self, 'shortcut{}'.format(i), shortcut) self.pluginLabel = QLabel(tr("Plugins (double-click to open)")) self.pluginLabel.setAlignment(Qt.AlignCenter) self.verticalLayout.addWidget(self.pluginLabel) self.pluginListView = QListView() self.pluginListView.setSelectionBehavior(QAbstractItemView.SelectRows) self.verticalLayout.addWidget(self.pluginListView) self.gridLayout.addLayout(self.verticalLayout, 1, 1, 1, 1) self.gridLayout.addItem(horizontalSpacer(), 1, 2, 1, 1) self.gridLayout.addItem(verticalSpacer(), 2, 1, 1, 1)
def __init__(self, controller): super(AppletNoticeWindow, self).__init__() self.__controller = controller self.__pkglist = [] # setup widgets self.__vbox_up = QVBoxLayout() self.__critical_label = QLabel() self.__critical_label.setWordWrap(True) self.__list_model = QStringListModel() self.__list_view = QListView() self.__list_view.setModel(self.__list_model) self.__vbox_up.addWidget(self.__critical_label) self.__vbox_up.addWidget(self.__list_view) # bottom buttons self.__vbox = QVBoxLayout() self.__vbox.addLayout(self.__vbox_up) self.__button_hbox = QHBoxLayout() self.__close_button = QPushButton(_("Close")) self.__launch_pm_button = QPushButton(_("Launch Application Browser")) self.__button_hbox.addWidget(self.__launch_pm_button) self.__button_hbox.addWidget(self.__close_button) self.__vbox.addLayout(self.__button_hbox) self.setLayout(self.__vbox) # set window settings self.resize(400, 200) self.setWindowTitle(_("Application updates")) self.__close_button.clicked.connect(self.on_close) self.__launch_pm_button.clicked.connect(self.on_pm)
def __init__(self, parent=None): super(ConfigurationView, self).__init__(parent) self._layout = QBoxLayout(QBoxLayout.TopToBottom) self.setLayout(self._layout) self._editView = EditView(parent) # initialize list view self._listView = QListView() self._configuration_model = self._get_config_model() self._listView.setModel(self._configuration_model) # initialize detail view self._detailView = QWidget() self._detailLayout = QBoxLayout(QBoxLayout.TopToBottom) self._detailView.setLayout(self._detailLayout) self._detailPanels = {} self._currentDetailPanel = None self._currentConfiguration = None # type: Configuration self._config_wide_print_amounts = {} self._recalculateEffectivePrintAmounts = False # add widgets to layout self._layout.addWidget(QLabel("List of Configurations")) self._layout.addWidget(self._listView) self._layout.addWidget(self._detailView) self._create_detail_view() # hide detail view on start self._detailView.hide() # selected configs map self._selected_configs = {} self._selected_counter = 0 # add event listener for selection change self._listView.clicked.connect(self._on_selection_change) self._listView.selectionModel().currentChanged.connect(self._on_selection_change)
class App(QMainWindow, QWidget): # 창의 대부분의 기능 def __init__(self): # 창 기본 세팅 설정 super().__init__() # Window options! self.title = 'HexQT' self.left = 0 self.top = 0 self.width = 1280 self.height = 840 self.rowSpacing = 4 # How many bytes before a double space. self.rowLength = 16 # 헥사 창에 얼마나 많은 byte 가 들어갈 것인지 self.byteWidth = 4 # How many bits to include in a byte. self.mode = Mode.READ self.initUI() # readFile ... Reads file data from a file in the form of bytes and generates the text for the hex-editor. def readFile(self, fileName): fileData = '' if fileName: with open(fileName, 'rb') as fileObj: fileData = fileObj.read() self.generateView(fileData) # generateView ... Generates text view for hexdump likedness. def generateView(self, text): space = ' ' bigSpace = ' ' * 4 rowSpacing = self.rowSpacing rowLength = self.rowLength offset = 0 offsetText = '' mainText = '' asciiText = '' for chars in range(1, len(text) + 1): byte = text[chars - 1] char = chr(text[chars - 1]) # Asciitext 는 오른쪽 출력부 if char is ' ': asciiText += '.' elif char is '\n': asciiText += '!' else: asciiText += char # main text 가 중앙에 있는것 mainText += format(byte, '0' + str(self.byteWidth) + 'x') if chars % rowLength is 0: offsetText += format(offset, '08x') + '\n' mainText += '\n' asciiText += '\n' elif chars % rowSpacing is 0: mainText += space * 2 else: mainText += space offset += len(char) self.offsetTextArea.setText(offsetText) self.mainTextArea.setText(mainText) self.asciiTextArea.setText(asciiText) # openFile ... Opens a file directory and returns the filename. def openFile(self): fileSelect = FileSelector() fileName = fileSelect.fileName self.readFile(fileName) # saveFile ... Method for saving the edited hex file. def saveFile(self): print('Saved!') # highlightMain ... Bi-directional highlighting from main. def highlightMain(self): # Create and get cursors for getting and setting selections. highlightCursor = QTextCursor(self.asciiTextArea.document()) # asciitextArea의 처음을 가르치는 커서를 구성 cursor = self.mainTextArea.textCursor() # 커서의 위치의 사본을 따서 복사 함 # Clear any current selections and reset text color. highlightCursor.select(QTextCursor.Document) highlightCursor.setCharFormat(QTextCharFormat()) highlightCursor.clearSelection() # Information about where selections and rows start. selectedText = cursor.selectedText() # The actual text selected. selectionStart = cursor.selectionStart() selectionEnd = cursor.selectionEnd() mainText = self.mainTextArea.toPlainText().replace('\n', 'A') totalBytes = 0 for char in mainText[selectionStart:selectionEnd]: if char is not ' ': totalBytes += len(char) asciiStart = 0 for char in mainText[:selectionStart]: if char is not ' ': asciiStart += len(char) totalBytes = round(totalBytes / self.byteWidth) asciiStart = round(asciiStart / self.byteWidth) asciiEnd = asciiStart + totalBytes asciiText = self.asciiTextArea.toPlainText() # Select text and highlight it. highlightCursor.setPosition(asciiStart, QTextCursor.MoveAnchor) highlightCursor.setPosition(asciiEnd, QTextCursor.KeepAnchor) highlight = QTextCharFormat() highlight.setBackground(Qt.red) highlightCursor.setCharFormat(highlight) highlightCursor.clearSelection() # highlightAscii ... Bi-directional highlighting from ascii. def highlightAscii(self): selectedText = self.asciiTextArea.textCursor().selectedText() # offsetJump ... Creates a dialogue and gets the offset to jump to and then jumps to that offset. def offsetJump(self): # input dialog 를 활용 하여 jump to ofsset 을 만듭니다. jumpText = InputDialogue('Jump to Offset', 'Offset').dialogueReponse jumpOffset = 0xF mainText = self.mainTextArea.toPlainText() mainText = mainText.strip().replace(' ', ' ') textCursor = self.mainTextArea.textCursor() # createMainView ... Creates the primary view and look of the application (3-text areas.) def createMainView(self): qhBox = QHBoxLayout() qhBox2 = QHBoxLayout() qvBox = QVBoxLayout() self.treeModel = QFileSystemModel() self.treeModel.setRootPath('') self.listModel = QFileSystemModel() self.listModel.setRootPath('') self.tree = QTreeView() self.tree.setModel(self.treeModel) self.listview = QListView() self.listview.setModel(self.listModel) self.mainTextArea = QTextEdit() self.offsetTextArea = QTextEdit() self.asciiTextArea = QTextEdit() # Initialize them all to read only. self.mainTextArea.setReadOnly(True) self.asciiTextArea.setReadOnly(True) self.offsetTextArea.setReadOnly(True) # Create the fonts and styles to be used and then apply them. font = QFont("DejaVu Sans Mono", 12, QFont.Normal, True) self.mainTextArea.setFont(font) self.asciiTextArea.setFont(font) self.offsetTextArea.setFont(font) self.offsetTextArea.setTextColor(Qt.red) # Syncing scrolls. syncScrolls(self.mainTextArea, self.asciiTextArea, self.offsetTextArea) # Highlight linking. BUG-GY # self.mainTextArea.selectionChanged.connect(self.highlightMain) # self.asciiTextArea.selectionChanged.connect(self.highlightAscii) qhBox.addWidget(self.offsetTextArea, 1) qhBox.addWidget(self.mainTextArea, 6) qhBox.addWidget(self.asciiTextArea, 2) qhBox2.addWidget(self.tree) qhBox2.addWidget(self.listview) self.tree.clicked.connect(self.on_clicked) qvBox.addLayout(qhBox2) qvBox.addLayout(qhBox) return qvBox def on_clicked(self, index): path = self.treeModel.fileInfo(index).absoluteFilePath() self.listview.setRootIndex(self.listModel.setRootPath(path)) # initUI ... Initializes the min look of the application. def initUI(self): # Initialize basic window options. self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # Center the window. qtRectangle = self.frameGeometry() centerPoint = QDesktopWidget().availableGeometry().center() qtRectangle.moveCenter(centerPoint) self.move(qtRectangle.topLeft()) # Creates a menu bar, (file, edit, options, etc...) mainMenu = self.menuBar() # Menus for window. fileMenu = mainMenu.addMenu('File') editMenu = mainMenu.addMenu('Edit') viewMenu = mainMenu.addMenu('View') helpMenu = mainMenu.addMenu('Help') # FILE MENU --------------------------------------- # Open button. openButton = QAction(QIcon(), 'Open', self) openButton.setShortcut('Ctrl+O') openButton.setStatusTip('Open file') openButton.triggered.connect(self.openFile) # Save button. saveButton = QAction(QIcon(), 'Save', self) saveButton.setShortcut('Ctrl+S') saveButton.setStatusTip('Open file') saveButton.triggered.connect(self.saveFile) # Optional exit stuff. exitButton = QAction(QIcon(), 'Exit', self) exitButton.setShortcut('Ctrl+Q') exitButton.setStatusTip('Exit application') exitButton.triggered.connect(self.close) fileMenu.addAction(openButton) fileMenu.addAction(saveButton) fileMenu.addAction(exitButton) # EDIT MENU --------------------------------------- # Jump to Offset offsetButton = QAction(QIcon(), 'Jump to Offset', self) offsetButton.setShortcut('Ctrl+J') offsetButton.setStatusTip('Jump to Offset') offsetButton.triggered.connect(self.offsetJump) editMenu.addAction(offsetButton) # Creating a widget for the central widget thingy. centralWidget = QWidget() centralWidget.setLayout(self.createMainView()) self.setCentralWidget(centralWidget) # Show our masterpiece. self.show()
def __init__(self, parent=None): super().__init__(parent) self._next_id = 0 self.list = list_ = QListView(self) #model = QStandardItemModel(self) model = EditStepsModel(self) list_.setModel(model) list_.setEditTriggers(QListView.NoEditTriggers) list_.selectionModel().currentChanged.connect(self._on_select) # Remove borders list_.setAttribute(Qt.WA_MacShowFocusRect, 0) list_.setFrameStyle(QFrame.Plain | QFrame.NoFrame) # Add borders to full set self.setAttribute(Qt.WA_MacShowFocusRect, 1) self.setFrameStyle(QFrame.Sunken | QFrame.Panel) self.setFocusPolicy(Qt.StrongFocus) self.setFocusProxy(list_) style = self.style() icon = style.standardIcon(QStyle.SP_DialogCancelButton) self._a_add = a_add = QAction( style.standardIcon(QStyle.SP_FileIcon), "Add new step", self, statusTip="Add a new step to compile process", triggered=self._on_add, ) self._a_del = a_del = QAction( style.standardIcon(QStyle.SP_DialogDiscardButton), "Remove a step", self, statusTip="Remove selected step from compile process", triggered=self._on_del, ) self._a_up = a_up = QAction( style.standardIcon(QStyle.SP_ArrowUp), "Move step up", self, statusTip="Move selected step up a position", triggered=self._on_up, ) self._a_down = a_down = QAction( style.standardIcon(QStyle.SP_ArrowDown), "Move step down", self, statusTip="Move selected step down a position", triggered=self._on_down, ) actions = QToolBar(self) actions.setFloatable(False) actions.setMovable(False) actions.setIconSize(QSize(16, 16)) actions.addAction(a_add) actions.addAction(a_del) actions.addAction(a_up) actions.addAction(a_down) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) layout.addWidget(list_) layout.addWidget(actions) self.setLayout(layout)
class FTPGUI(QMainWindow): def __init__(self): super().__init__() self.debug = False self.ftp = mFTP() if self.debug: self.ftp.open_handler('127.0.0.1', 8000) self.ftp.user_handler('anonymous', 'password') self.initUI() self.threadpool = QThreadPool() self.getFlags = [] self.putFlags = [] def initUI(self): self.centerwidget = QWidget(self) self.setCentralWidget(self.centerwidget) self.setupLayout(self.centerwidget) self.setupMenu() self.setupWidget() self.resize(1200, 960) self.center() self.setWindowTitle('Minimum-FTP') self.show() def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def setupLayout(self, wid): # Auth related widget authlay = QHBoxLayout() hostLabel = QLabel('Host:') portLabel = QLabel('Port:') usernameLabel = QLabel('Username:'******'Password:'******'Connect', self) if self.debug: self.connectBtn.setEnabled(False) # self.connectBtn.setIcon(QApplication.style().standardIcon(QStyle.SP_DirIcon)) authlay.addWidget(hostLabel) authlay.addWidget(self.hostInput) authlay.addWidget(portLabel) authlay.addWidget(self.portInput) authlay.addWidget(usernameLabel) authlay.addWidget(self.usernameInput) authlay.addWidget(passwordLabel) authlay.addWidget(self.passwordInput) authlay.addWidget(self.connectBtn) # Show commands in this widget commandlay = QVBoxLayout() commandLabel = QLabel('Command Window') self.commandText = QTextEdit() commandlay.addWidget(commandLabel) commandlay.addWidget(self.commandText) # Show local file and remote file in this widget locallay = QVBoxLayout() localpathlay = QHBoxLayout() remotelay = QVBoxLayout() remotepathlay = QHBoxLayout() localfileLabel = QLabel('Local File') remotefileLabel = QLabel('Remote File') self.localfileLine = QLineEdit() self.remotefileLine = QLineEdit() self.localfileList = QListView() self.remotefileList = QListView() # self.localfileReload = QPushButton() # self.remotefileReload = QPushButton() # self.localfileReload.setIcon(QApplication.style().standardIcon(QStyle.SP_BrowserReload)) # self.remotefileReload.setIcon(QApplication.style().standardIcon(QStyle.SP_BrowserReload)) localpathlay.addWidget(localfileLabel) localpathlay.addWidget(self.localfileLine) # localpathlay.addWidget(self.localfileReload) remotepathlay.addWidget(remotefileLabel) remotepathlay.addWidget(self.remotefileLine) # remotepathlay.addWidget(self.remotefileReload) locallay.addLayout(localpathlay) locallay.addWidget(self.localfileList) remotelay.addLayout(remotepathlay) remotelay.addWidget(self.remotefileList) localframe = QFrame(self) localframe.setFrameShape(QFrame.StyledPanel) localframe.setLayout(locallay) remoteframe = QFrame(self) remoteframe.setFrameShape(QFrame.StyledPanel) remoteframe.setLayout(remotelay) filesplitter = QSplitter(Qt.Horizontal) filesplitter.addWidget(localframe) filesplitter.addWidget(remoteframe) self.tasklist = QListWidget(self) # Set overall layout vlay = QVBoxLayout() authframe = QFrame(self) authframe.setFrameShape(QFrame.StyledPanel) authframe.setLayout(authlay) commandframe = QFrame(self) commandframe.setFrameShape(QFrame.StyledPanel) commandframe.setLayout(commandlay) topsplitter = QSplitter(Qt.Vertical) topsplitter.addWidget(authframe) topsplitter.addWidget(commandframe) topsplitter.addWidget(filesplitter) topsplitter.addWidget(self.tasklist) vlay.addWidget(topsplitter) wid.setLayout(vlay) def setupMenu(self): self.statusbar = self.statusBar() self.statusbar.showMessage('Ready') menubar = self.menuBar() menubar.setNativeMenuBar(False) fileMenu = menubar.addMenu('File') aboutMenu = menubar.addMenu('About') modeMenu = QMenu('Mode', self) self.binaryAct = QAction('Binary', self, checkable=True) self.binaryAct.setChecked(False) self.binaryAct.triggered.connect(self.setBinary) modeMenu.addAction(self.binaryAct) fileMenu.addMenu(modeMenu) systemAct = QAction('System', self) systemAct.triggered.connect(self.checkSystem) aboutMenu.addAction(systemAct) def setupWidget(self): self.connectBtn.clicked.connect(self.connectClicked) self.commandText.setReadOnly(True) self.localfileLine.setReadOnly(True) self.remotefileLine.setReadOnly(True) self.localfileModel = LocalFileSystemModel() self.localfileList.setModel(self.localfileModel) self.localfileList.doubleClicked.connect(self.doubleClickLocalFile) self.localfileLine.setText(str(self.localfileModel.path)) self.remotefileModel = RemoteFileSystemModel(self.ftp, self) self.remotefileList.setModel(self.remotefileModel) self.remotefileList.doubleClicked.connect(self.doubleClickRemoteFile) self.remotefileLine.setText(str(self.remotefileModel.path)) # self.localfileReload.clicked.connect(self.localfileModel.setupItem) # self.remotefileReload.clicked.connect(self.remotefileModel.setupItem) self.remotefileList.installEventFilter(self) self.localfileList.installEventFilter(self) def eventFilter(self, source, event): if (event.type() == QEvent.ContextMenu and source is self.remotefileList): menu = QMenu() getAct = QAction('Download', self) menu.addAction(getAct) mkdirAct = QAction('New Directory', self) mkdirAct.triggered.connect(self.remoteMkdir) menu.addAction(mkdirAct) rmdirAct = QAction('Remove Directory', self) menu.addAction(rmdirAct) renameAct = QAction('Rename', self) menu.addAction(renameAct) refreshAct = QAction('Refresh', self) menu.addAction(refreshAct) action = menu.exec_(event.globalPos()) if action: item = source.indexAt(event.pos()) item_name = item.data() if action == rmdirAct: self.remoteRmdir(item_name) elif action == renameAct: self.remoteRename(item_name) elif action == refreshAct: self.remotefileModel.setupItem() elif action == getAct: self.getSlot(item_name) return True elif (event.type() == QEvent.ContextMenu and source is self.localfileList): menu = QMenu() putAct = QAction('Upload', self) menu.addAction(putAct) action = menu.exec_(event.globalPos()) if action: item = source.indexAt(event.pos()) item_name = item.data() if action == putAct: self.putSlot(item_name) return super(FTPGUI, self).eventFilter(source, event) def putSlot(self, filename): downloadtask = QListWidgetItem(self.tasklist) self.tasklist.addItem(downloadtask) dlvlay = QHBoxLayout() listwidget = QWidget(self) typelabel = QLabel('Upload') dlfilename = QLabel(filename[:30]) downloadprogress = QProgressBar(self) dlbutton = QPushButton('Pause') dlvlay.addWidget(typelabel, 1) dlvlay.addWidget(dlfilename, 2) dlvlay.addWidget(downloadprogress, 6) dlvlay.addWidget(dlbutton, 1) listwidget.setLayout(dlvlay) downloadtask.setSizeHint(listwidget.sizeHint()) downloadtask.setFlags(downloadtask.flags() & ~Qt.ItemIsSelectable) self.tasklist.setItemWidget(downloadtask, listwidget) path = self.localfileModel.path / filename putPauseflag = { 'stop': False, 'button': dlbutton, 'dlpb': downloadprogress, 'localname': path, 'remotefullpath': self.remotefileModel.path, 'remotename': filename } self.putFlags.append(putPauseflag) id = len(self.putFlags) - 1 dlbutton.clicked.connect(self.putPauseSlot(id)) worker = putWorker(self.ftp, path, filename, 0, downloadprogress, self.putUpdatePBSlot, self.putFinishSlot, putPauseflag, id) self.threadpool.start(worker) def putUpdatePBSlot(self, tup): tup[1].setValue(tup[0]) def putFinishSlot(self, tup): new_code = 0 if tup[1] == 1: new_code = 1 putPauseflag = self.putFlags[tup[3]] self.printLog([tup[0], new_code], 'put ' + tup[2]) if tup[1] != 1: self.remotefileModel.setupItem() if tup[1] == 0: putPauseflag['stop'] = True putPauseflag['button'].setEnabled(False) def putPauseSlot(self, id): def realPauseSlot(): putPauseflag = self.putFlags[id] if not putPauseflag['stop']: putPauseflag['stop'] = True putPauseflag['button'].setText('Continue') else: putPauseflag['stop'] = False putPauseflag['button'].setText('Pause') localname = putPauseflag['localname'] remotename = putPauseflag['remotename'] remotefullpath = putPauseflag['remotefullpath'] dlpb = putPauseflag['dlpb'] info = self.remotefileModel.getinfo(remotefullpath, remotename) # if info['size']: try: size = info['size'] except: size = 0 worker = putWorker(self.ftp, localname, remotefullpath + '/' + remotename, size, dlpb, self.putUpdatePBSlot, self.putFinishSlot, putPauseflag, id) self.threadpool.start(worker) return realPauseSlot def doubleClickLocalFile(self, index): self.localfileModel.changeDir(index.data()) self.localfileLine.setText(str(self.localfileModel.path)) def getSlot(self, filename): remotefilename = filename remotefullpath = self.remotefileModel.path localfilename = str(self.localfileModel.path / filename) size = self.remotefileModel.file_info[remotefilename]['size'] gettaskitem = QListWidgetItem(self.tasklist) self.tasklist.addItem(gettaskitem) dlvlay = QHBoxLayout() listwidget = QWidget(self) typelabel = QLabel('Download') dlfilename = QLabel(filename[:30]) getpb = QProgressBar(self) dlbutton = QPushButton('Pause') dlvlay.addWidget(typelabel, 1) dlvlay.addWidget(dlfilename, 2) dlvlay.addWidget(getpb, 6) dlvlay.addWidget(dlbutton, 1) listwidget.setLayout(dlvlay) gettaskitem.setSizeHint(listwidget.sizeHint()) gettaskitem.setFlags(gettaskitem.flags() & ~Qt.ItemIsSelectable) self.tasklist.setItemWidget(gettaskitem, listwidget) getPauseflag = { 'stop': False, 'button': dlbutton, 'getpb': getpb, 'localname': localfilename, 'remotefullpath': remotefullpath, 'remotename': filename, 'size': size } self.getFlags.append(getPauseflag) id = len(self.getFlags) - 1 dlbutton.clicked.connect(self.getPauseSlot(id)) worker = getWorker(self.ftp, localfilename, remotefullpath + '/' + remotefilename, False, getpb, self.getUpdatePBSlot, self.getFinishSlot, self.getFlags[id], id) self.threadpool.start(worker) def getUpdatePBSlot(self, tup): tup[1].setValue(tup[0]) def getFinishSlot(self, tup): new_code = 0 getPauseflag = self.getFlags[tup[3]] if tup[1] == 1: new_code = 1 self.printLog([tup[0], new_code], 'get ' + tup[2]) if tup[1] != 1: self.localfileModel.setupItem() if tup[1] == 0: getPauseflag['stop'] = True getPauseflag['button'].setEnabled(False) def getPauseSlot(self, id): def realPauseSlot(): getPauseflag = self.getFlags[id] if not getPauseflag['stop']: getPauseflag['stop'] = True getPauseflag['button'].setText('Continue') else: getPauseflag['stop'] = False getPauseflag['button'].setText('Pause') localfilename = getPauseflag['localname'] remotefullpath = getPauseflag['remotefullpath'] remotename = getPauseflag['remotename'] getpb = getPauseflag['getpb'] worker = getWorker(self.ftp, localfilename, remotefullpath + '/' + remotename, True, getpb, self.getUpdatePBSlot, self.getFinishSlot, getPauseflag, id) self.threadpool.start(worker) return realPauseSlot def remoteMkdir(self): text, ok = QInputDialog.getText(self, 'New Directory', 'Enter new directory name:') if not ok: return mkdirresult = self.ftp.mkdir_handler(text) self.printLog(mkdirresult, 'mkdir ' + text) if mkdirresult[1] == 0: self.remotefileModel.setupItem() def remoteRmdir(self, dirname): rmdirresult = self.ftp.rmdir_handler(dirname) self.printLog(rmdirresult, 'rmdir ' + dirname) if rmdirresult[1] == 0: self.remotefileModel.setupItem() def remoteRename(self, oldname): newname, ok = QInputDialog.getText(self, 'Rename', 'Enter new file name:') if not ok: return renameresult = self.ftp.rename_handler(oldname, newname) self.printLog(renameresult, 'rename ' + oldname + ' ' + newname) if renameresult[1] == 0: self.remotefileModel.setupItem() def doubleClickRemoteFile(self, index): self.remotefileModel.changeDir(index.data()) self.remotefileLine.setText(str(self.remotefileModel.path)) def connectClicked(self): if self.connectBtn.text() == 'Connect': host = self.hostInput.text() # TODO: more robust port = int(self.portInput.text()) username = self.usernameInput.text() password = self.passwordInput.text() openresult = self.ftp.open_handler(host, port) self.printLog(openresult, 'open ' + host + ' ' + str(port)) if openresult[1] != 0: return loginresult = self.ftp.user_handler(username, password) self.printLog(loginresult, 'user ' + username + ' ' + '*' * len(password)) if loginresult[1] == 0: self.connectBtn.setText('Disconnect') self.remotefileModel.setupItem() else: byeresult = self.ftp.bye_handler() self.printLog(byeresult, 'bye') if byeresult[1] == 0: self.connectBtn.setText('Connect') self.remotefileModel.removeRows( 0, self.remotefileModel.rowCount()) def setBinary(self): if not self.ftp.open_status: return binresult = self.ftp.binary_handler() self.printLog(binresult, 'binary') if binresult[1] == 0: self.binaryAct.setChecked(True) def checkSystem(self): if self.ftp.open_status: sysresult = self.ftp.system_handler() self.printLog(sysresult, 'system') if sysresult[1] == 0: message = sysresult[0].strip('\r\n') else: message = 'Something wrong while receiving data.' else: message = 'No connection established.' msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setText("FTP Server System Information") msg.setInformativeText(message) msg.setWindowTitle("About-System") msg.setStandardButtons(QMessageBox.Ok) msg.exec_() def printLog(self, result, command): greenColor = QColor(46, 139, 87) blueColor = QColor(0, 0, 255) redColor = QColor(255, 0, 0) blackColor = QColor(0, 0, 0) self.setUpdatesEnabled(False) self.commandText.append( "<span style='color:#4169E1'>>ftp </span><span style='color:#2F4F4F'>" + command + "</span>") if result[1] == 0: self.commandText.setTextColor(greenColor) elif result[1] == 1: self.commandText.setTextColor(redColor) else: self.commandText.setTextColor(redColor) self.commandText.append(result[0].strip('\r\n')) self.setUpdatesEnabled(True)
class App(QMainWindow): def __init__(self): super().__init__() # self.gfont = FontProperties(fname='assets/PingFang.ttc') self.accuser = Accuser() self.dbconn = DBConn() self.scheduler = Scheduler(self.dbconn) self.scheduler_status = False self.automaton = ReAutomaton() self.analyzer = anal.Analyzer(self.dbconn) self.init_ui() def closeEvent(self, a0): self.scheduler.browser.quit() return super().closeEvent(a0) def init_ui(self): self.setWindowTitle("Weibo Monitor") self.setGeometry(30, 30, 1024, 720) self.init_components() self.show() def init_components(self): self.gwidget = QTabWidget() self.setCentralWidget(self.gwidget) self.glayout = QHBoxLayout() self.crawl_widget = QWidget() self.ana_widget = QWidget() self.init_crawl_widget() self.init_ana_widget() self.gwidget.addTab(self.crawl_widget, "Crawl") self.gwidget.addTab(self.ana_widget, "Analyze") self.init_triggers() self.running = False def init_crawl_widget(self): self.llayout = QVBoxLayout() self.crawl_widget.setLayout(self.llayout) self.log_label = QLabel("Log") self.log_list = QTableView() self.log_model = QStandardItemModel() self.log_model.setColumnCount(3) self.log_model.setHorizontalHeaderLabels(["Status", "Time", "Message"]) self.log_list.setModel(self.log_model) self.log_list.horizontalHeader().setSectionResizeMode( QHeaderView.Stretch) self.log_list.horizontalHeader().setSectionResizeMode( 0, QHeaderView.ResizeToContents) self.log_list.horizontalHeader().setSectionResizeMode( 1, QHeaderView.ResizeToContents) self.log_list.horizontalHeader().setSectionResizeMode( 2, QHeaderView.ResizeToContents) log_widget = QWidget() log_layout = QVBoxLayout() log_layout.addWidget(self.log_label) log_layout.addWidget(self.log_list) log_widget.setLayout(log_layout) self.rule_label = QLabel("Rule") self.rule_edit = QTextEdit() rule_widget = QWidget() rule_layout = QVBoxLayout() rule_layout.addWidget(self.rule_label) rule_layout.addWidget(self.rule_edit) rule_widget.setLayout(rule_layout) self.crawl_button = QPushButton('Crawl') self.llayout.addWidget(log_widget) self.llayout.addWidget(rule_widget) self.llayout.addWidget(self.crawl_button) self.llayout.setStretch(0, 15) self.llayout.setStretch(1, 6) self.llayout.setStretch(2, 1) def init_ana_widget(self): self.rlayout = QHBoxLayout() self.ana_widget.setLayout(self.rlayout) self.fig = Figure() self.canvas = FigureCanvas(self.fig) self.canvas_label = QLabel("Result") canvas_widget = QWidget() canvas_layout = QVBoxLayout() canvas_widget.setLayout(canvas_layout) canvas_layout.addWidget(self.canvas_label) canvas_layout.addWidget(self.canvas) canvas_layout.setStretch(0, 1) canvas_layout.setStretch(1, 20) self.tracklist_panel = QWidget() self.tracklist_layout = QVBoxLayout() self.tracklist_panel.setLayout(self.tracklist_layout) self.init_topic_tracklist() self.init_weibo_tracklist() self.tracklist_layout.addWidget(self.topic_tracklist_widget) self.tracklist_layout.addWidget(self.weibo_tracklist_widget) self.rlayout.addWidget(self.tracklist_panel) self.rlayout.addWidget(canvas_widget) cfg = self.scheduler.load_config() for topic_name in cfg['topic_tracklist']: self.topic_tracklist_model.appendRow(QStandardItem(topic_name)) for weibo_id in cfg["weibo_id_tracklist"]: self.weibo_tracklist_model.appendRow(QStandardItem(str(weibo_id))) def init_topic_tracklist(self): self.topic_tracklist = QListView() self.topic_tracklist_label = QLabel("Topic Track List") self.topic_tracklist_model = QStandardItemModel() self.topic_tracklist.setModel(self.topic_tracklist_model) topic_tracklist_buttons = QWidget() topic_tracklist_buttons_layout = QHBoxLayout() topic_tracklist_buttons_layout.setSpacing(0) topic_tracklist_buttons_layout.setContentsMargins(0, 0, 0, 0) topic_tracklist_buttons.setLayout(topic_tracklist_buttons_layout) self.topic_tracklist_add_button = QPushButton("+") self.topic_tracklist_del_button = QPushButton("-") self.topic_tracklist_conf_button = QPushButton("confirm") self.topic_analyze_button = QPushButton("analyze") topic_tracklist_buttons_layout.addWidget( self.topic_tracklist_add_button) topic_tracklist_buttons_layout.addWidget( self.topic_tracklist_del_button) topic_tracklist_buttons_layout.addStretch(20) topic_tracklist_buttons_layout.addWidget( self.topic_tracklist_conf_button) topic_tracklist_buttons_layout.addWidget(self.topic_analyze_button) topic_tracklist_buttons_layout.setStretch(0, 6) topic_tracklist_buttons_layout.setStretch(1, 6) topic_tracklist_buttons_layout.setStretch(2, 6) topic_tracklist_buttons_layout.setStretch(3, 6) self.topic_tracklist_widget = QWidget() topic_tracklist_layout = QVBoxLayout() self.topic_tracklist_widget.setLayout(topic_tracklist_layout) topic_tracklist_layout.addWidget(self.topic_tracklist_label) topic_tracklist_layout.addWidget(self.topic_tracklist) topic_tracklist_layout.addWidget(topic_tracklist_buttons) def init_weibo_tracklist(self): self.weibo_tracklist = QListView() self.weibo_tracklist_label = QLabel("Weibo Track List") self.weibo_tracklist_model = QStandardItemModel() self.weibo_tracklist.setModel(self.weibo_tracklist_model) weibo_tracklist_buttons = QWidget() weibo_tracklist_buttons_layout = QHBoxLayout() weibo_tracklist_buttons_layout.setSpacing(0) weibo_tracklist_buttons_layout.setContentsMargins(0, 0, 0, 0) weibo_tracklist_buttons.setLayout(weibo_tracklist_buttons_layout) self.weibo_tracklist_add_button = QPushButton("+") self.weibo_tracklist_del_button = QPushButton("-") self.weibo_tracklist_conf_button = QPushButton("confirm") self.weibo_analyze_button = QPushButton("analyze") weibo_tracklist_buttons_layout.addWidget( self.weibo_tracklist_add_button) weibo_tracklist_buttons_layout.addWidget( self.weibo_tracklist_del_button) weibo_tracklist_buttons_layout.addStretch(20) weibo_tracklist_buttons_layout.addWidget( self.weibo_tracklist_conf_button) weibo_tracklist_buttons_layout.addWidget(self.weibo_analyze_button) weibo_tracklist_buttons_layout.setStretch(0, 6) weibo_tracklist_buttons_layout.setStretch(1, 6) weibo_tracklist_buttons_layout.setStretch(2, 6) weibo_tracklist_buttons_layout.setStretch(3, 6) self.weibo_sentiment_checkbox = QCheckBox("Comment Sentimnet") weibo_analyze_options = QWidget() weibo_analyze_options_layout = QHBoxLayout() weibo_analyze_options.setLayout(weibo_analyze_options_layout) weibo_analyze_options_layout.addWidget(self.weibo_sentiment_checkbox) self.weibo_tracklist_widget = QWidget() weibo_tracklist_layout = QVBoxLayout() self.weibo_tracklist_widget.setLayout(weibo_tracklist_layout) weibo_tracklist_layout.addWidget(self.weibo_tracklist_label) weibo_tracklist_layout.addWidget(self.weibo_tracklist) weibo_tracklist_layout.addWidget(weibo_tracklist_buttons) weibo_tracklist_layout.addWidget(weibo_analyze_options) def init_triggers(self): self.crawl_button.clicked.connect(self.crawl_button_clicked) self.topic_tracklist_add_button.clicked.connect( self.topic_add_button_clicked) self.topic_tracklist_del_button.clicked.connect( self.topic_del_button_clicked) self.topic_tracklist_conf_button.clicked.connect( self.topic_conf_button_clicked) self.topic_analyze_button.clicked.connect( self.topic_analyze_button_clicked) self.weibo_tracklist_add_button.clicked.connect( self.weibo_add_button_clicked) self.weibo_tracklist_del_button.clicked.connect( self.weibo_del_button_clicked) self.weibo_tracklist_conf_button.clicked.connect( self.weibo_conf_button_clicked) self.weibo_analyze_button.clicked.connect( self.weibo_analyze_button_clicked) @pyqtSlot() def crawl_button_clicked(self): rule_text = self.rule_edit.toPlainText().strip() if rule_text: try: rule = eval(rule_text) assert isinstance(rule, ReRule) except Exception as ex: QMessageBox.information(self, "Invalid Rule Syntax", '\n'.join(ex.args)) return self.automaton.set_rule(rule) if self.scheduler_status: self.log("Restart Crawlers", "INFO") else: self.scheduler_status = True self.crawl_button.setText("Restart Crawler") self.log("Start Crawlers", "INFO") self.scheduler.terminate() self.scheduler.wait() self.scheduler.set_weibo_handler(self.handle_weibo) self.scheduler.set_topic_handler(self.handle_topic) self.scheduler.start() @pyqtSlot() def topic_analyze_button_clicked(self): indexes = self.topic_tracklist.selectedIndexes() if not indexes: return index = indexes[0] topic_name = self.topic_tracklist_model.item(index.row()).text() if not topic_name: return topic = self.analyzer.get_topic(topic_name) if not topic: return topic_heat = self.analyzer.get_topic_heat(topic) self.fig.clear() ax = self.fig.add_subplot(111) times = list(map(lambda x: x[0], topic_heat)) heats = list(map(lambda x: x[1], topic_heat)) ax.plot(times, heats) # ax.set_title(topic_name, fontproperties=self.gfont) self.fig.autofmt_xdate() self.canvas.draw() @pyqtSlot() def weibo_analyze_button_clicked(self): indexes = self.weibo_tracklist.selectedIndexes() if not indexes: return index = indexes[0] weibo_id = self.weibo_tracklist_model.item(index.row()).text() if not weibo_id: return weibo_id = int(weibo_id) weibo = self.analyzer.get_weibo(weibo_id) if not weibo: return weibo_heat = self.analyzer.get_weibo_heat(weibo) self.fig.clear() ax = self.fig.add_subplot(111) times = list(map(lambda x: x[0], weibo_heat)) heats = list(map(lambda x: x[1], weibo_heat)) ax.plot(times, heats) topics = self.analyzer.get_weibo_topics(weibo_id) sentiment = self.analyzer.get_sentiment(weibo['text']) # ax.set_title('#'.join(topics) + "--Sentiment: {:.3f}".format(sentiment), fontproperties=self.gfont) self.fig.autofmt_xdate() self.canvas.draw() @pyqtSlot() def topic_add_button_clicked(self): item = QStandardItem("") self.topic_tracklist_model.appendRow(item) self.topic_tracklist.setCurrentIndex(item.index()) @pyqtSlot() def topic_del_button_clicked(self): index = self.topic_tracklist.selectedIndexes()[0] self.topic_tracklist_model.removeRow(index.row()) if self.topic_tracklist_model.rowCount(): self.topic_tracklist.setCurrentIndex( self.topic_tracklist_model.index(0, 0)) @pyqtSlot() def topic_conf_button_clicked(self): topics = [ self.topic_tracklist_model.item(idx).text() for idx in range(self.topic_tracklist_model.rowCount()) ] topic_tracklist = ','.join(topics) self.scheduler.config.set("TopicSpider", "topic_tracklist", topic_tracklist) with open("config.ini", "w") as fp: self.scheduler.config.write(fp) @pyqtSlot() def weibo_add_button_clicked(self): item = QStandardItem("") self.weibo_tracklist_model.appendRow(item) self.weibo_tracklist.setCurrentIndex(item.index()) @pyqtSlot() def weibo_del_button_clicked(self): index = self.weibo_tracklist.selectedIndexes()[0] self.weibo_tracklist_model.removeRow(index.row()) if self.weibo_tracklist_model.rowCount(): self.weibo_tracklist.setCurrentIndex( self.weibo_tracklist_model.index(0, 0)) @pyqtSlot() def weibo_conf_button_clicked(self): weibo_ids = [ self.weibo_tracklist_model.item(idx).text() for idx in range(self.weibo_tracklist_model.rowCount()) ] weibo_tracklist = ','.join(weibo_ids) self.scheduler.config.set("WeiboSpider", "weibo_id_tracklist", weibo_tracklist) with open("config.ini", "w") as fp: self.scheduler.config.write(fp) def handle_weibo(self, weibo): self.dbconn.process_weibo(weibo) if self.automaton.match(weibo.text): msg = "Matched Weibo {}: {}".format(weibo.weibo_id, repr(weibo.text)) self.log(msg, "WARNING") self.handle_matched_weibo(weibo) else: msg = "Process Weibo {}".format(weibo.weibo_id) self.log(msg, "NORMAL") def handle_matched_weibo(self, weibo): reason = '匹配敏感关键字规则\n' + self.rule_edit.toPlainText() if self.accuser.accuse_weibo(weibo, reason): msg = "Accuse weibo {}".format(weibo.weibo_id) self.log(msg, "INFO") def handle_topic(self, topic): self.dbconn.process_topic(topic) msg = "Process Topic {}".format(repr(topic.name)) self.log(msg, "NORMAL") def log(self, msg, status_str="INFO"): time_str = datetime.now().strftime("%Y-%m-%d-%H:%M:%S") self.log_model.appendRow([ QStandardItem(status_str), QStandardItem(time_str), QStandardItem(msg) ])
class VistaListaAttrezzatura(QWidget): def __init__(self, callback): super(VistaListaAttrezzatura, self).__init__() # Attributi self.controller_lista_attrezzatura = ControllerListaAttrezzatura() self.callback = callback self.layout_verticale1 = QVBoxLayout() self.layout_orizzontale = QHBoxLayout() self.layout_verticale2 = QVBoxLayout() # Sfondo self.show_background("LISTA ATTREZZATURA") self.layout_verticale1.addSpacerItem(QSpacerItem(0, 200)) self.layout_orizzontale.addSpacerItem(QSpacerItem(100, 0)) # Lista self.vista_lista = QListView() label = self.aggiorna() self.layout_orizzontale.addWidget(label) self.layout_orizzontale.addSpacerItem(QSpacerItem(1000, 0)) # Pulsanti Apri e Indietro allineati self.show_pulsantiera() # Spaziatura self.layout_orizzontale.addSpacerItem(QSpacerItem(150, 0)) self.layout_verticale1.addLayout(self.layout_orizzontale) if self.controller_lista_attrezzatura.get_lista_filtrata() == []: self.layout_verticale1.addSpacerItem(QSpacerItem(0, 350)) else: self.layout_verticale1.addSpacerItem(QSpacerItem(0, 150)) # Impostazione layout totale self.setLayout(self.layout_verticale1) self.setWindowTitle('Lista Attrezzatura') # Metodo che, collegato al pulsante "INDIETRO", permette di tornare alla vista precedente def indietro(self): self.callback() self.controller_lista_attrezzatura.salva_dati() self.close() # Creazione, settaggio e stile dello sfondo def show_background(self, stringa): # Sfondo self.setFixedWidth(QDesktopWidget().width()) self.setFixedHeight(QDesktopWidget().height()) back_img = QImage("Data/Immagini/imagine.jpg") img = back_img.scaled(self.width(), self.height()) palette = QPalette() palette.setBrush(10, QBrush(img)) self.setPalette(palette) # Titolo titolo = QLabel(stringa) titolo.setAlignment(Qt.AlignCenter) titolo.setFont(QFont('Times New Roman', 60)) self.layout_verticale1.addSpacerItem(QSpacerItem(0, 50, QSizePolicy.Fixed, QSizePolicy.Fixed)) self.layout_verticale1.addWidget(titolo) self.layout_verticale1.addSpacerItem(QSpacerItem(0, 100, QSizePolicy.Fixed, QSizePolicy.Fixed)) # Creazione, settaggio e stile pulsanti def show_pulsantiera(self): if not self.controller_lista_attrezzatura.get_lista_filtrata() == []: pulsante_apri = QPushButton("Apri") pulsante_apri.setFont(QFont('Times New Roman', 20, 100, True)) pulsante_apri.setStyleSheet('QPushButton {background-color: orange; color: black;}') pulsante_apri.setFixedSize(250, 100) pulsante_apri.clicked.connect(self.attrezzatura_selezionata) self.layout_verticale2.addWidget(pulsante_apri) # Pulsante indietro pulsante_indietro = QPushButton("Indietro") pulsante_indietro.setFont(QFont('Times New Roman', 20, 100, True)) pulsante_indietro.setStyleSheet('QPushButton {background-color: orange; color: black;}') pulsante_indietro.setFixedSize(250, 100) pulsante_indietro.clicked.connect(self.indietro) self.layout_verticale2.addWidget(pulsante_indietro) self.layout_verticale2.addSpacerItem(QSpacerItem(0, 50)) self.layout_orizzontale.addLayout(self.layout_verticale2) # Metodo che gestisce la situazione in cui al click del pulsante "APRI", non venga selezionato niente # con gestione delle eccezioni def attrezzatura_selezionata(self): try: selezionata = self.vista_lista.selectedIndexes()[0].row() lista = self.controller_lista_attrezzatura.get_lista_filtrata() attrezzatura = lista[selezionata] self.vista_attrezzatura = VistaAttrezzatura(self.showFullScreen, attrezzatura, self.controller_lista_attrezzatura.prenota_attrezzatura, self.aggiorna) self.vista_attrezzatura.showFullScreen() except IndexError: QMessageBox.information(self, 'Attenzione!', 'Non hai selezionato nessuna attrezzatura.', QMessageBox.Ok, QMessageBox.Ok) except: QMessageBox.critical(self, 'Errore!', 'Qualcosa è andato storto, riprova più tardi.', QMessageBox.Ok, QMessageBox.Ok) # Metodo che aggiorna la finestra def aggiorna(self): vista_lista_model = QStandardItemModel(self.vista_lista) if self.controller_lista_attrezzatura.get_lista_filtrata() == []: label = QLabel(" Non ci sono oggetti disponibili adatti\nalle tue caratteristiche") label.setAlignment(Qt.AlignCenter) label.setFont(QFont('Times New Roman', 25, 100)) label.setStyleSheet('QLabel {background-color: lightBlue; color: black;}') label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum) self.layout_orizzontale.addSpacerItem(QSpacerItem(0, 50)) return label else: for attrezzatura in self.controller_lista_attrezzatura.get_lista_filtrata(): item = QStandardItem() nome = attrezzatura.get_nome() item.setText(nome) item.setEditable(False) item.setFont(QFont('Times New Roman', 30, 100)) vista_lista_model.appendRow(item) self.vista_lista.setModel(vista_lista_model) return self.vista_lista
def closeEvent(self, e): logger.debug('closeEvent') QListView.closeEvent(self, e)
def __init__(self): super().__init__() self.setLayout(QVBoxLayout()) self.setWindowTitle(i18n("Export Settings")) buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) mainWidget = QTabWidget() self.layout().addWidget(mainWidget) self.layout().addWidget(buttons) # Set basic crop settings # Set which layers to remove before export. mainExportSettings = QWidget() mainExportSettings.setLayout(QVBoxLayout()) groupExportCrop = QGroupBox(i18n("Crop Settings")) formCrop = QFormLayout() groupExportCrop.setLayout(formCrop) self.chk_toOutmostGuides = QCheckBox(i18n("Crop to outmost guides")) self.chk_toOutmostGuides.setChecked(True) self.chk_toOutmostGuides.setToolTip(i18n("This will crop to the outmost guides if possible and otherwise use the underlying crop settings.")) formCrop.addRow("", self.chk_toOutmostGuides) btn_fromSelection = QPushButton(i18n("Set Margins from Active Selection")) btn_fromSelection.clicked.connect(self.slot_set_margin_from_selection) # This doesn't work. formCrop.addRow("", btn_fromSelection) self.spn_marginLeft = QSpinBox() self.spn_marginLeft.setMaximum(99999) self.spn_marginLeft.setSuffix(" px") formCrop.addRow(i18n("Left:"), self.spn_marginLeft) self.spn_marginTop = QSpinBox() self.spn_marginTop.setMaximum(99999) self.spn_marginTop.setSuffix(" px") formCrop.addRow(i18n("Top:"), self.spn_marginTop) self.spn_marginRight = QSpinBox() self.spn_marginRight.setMaximum(99999) self.spn_marginRight.setSuffix(" px") formCrop.addRow(i18n("Right:"), self.spn_marginRight) self.spn_marginBottom = QSpinBox() self.spn_marginBottom.setMaximum(99999) self.spn_marginBottom.setSuffix(" px") formCrop.addRow(i18n("Bottom:"), self.spn_marginBottom) groupExportLayers = QGroupBox(i18n("Layers")) formLayers = QFormLayout() groupExportLayers.setLayout(formLayers) self.cmbLabelsRemove = labelSelector() formLayers.addRow(i18n("Label for removal:"), self.cmbLabelsRemove) self.ln_text_layer_name = QLineEdit() self.ln_text_layer_name.setToolTip(i18n("These are keywords that can be used to identify text layers. A layer only needs to contain the keyword to be recognized. Keywords should be comma separated.")) self.ln_panel_layer_name = QLineEdit() self.ln_panel_layer_name.setToolTip(i18n("These are keywords that can be used to identify panel layers. A layer only needs to contain the keyword to be recognized. Keywords should be comma separated.")) formLayers.addRow(i18n("Text Layer Key:"), self.ln_text_layer_name) formLayers.addRow(i18n("Panel Layer Key:"), self.ln_panel_layer_name) mainExportSettings.layout().addWidget(groupExportCrop) mainExportSettings.layout().addWidget(groupExportLayers) mainWidget.addTab(mainExportSettings, i18n("General")) # CBZ, crop, resize, which metadata to add. CBZexportSettings = QWidget() CBZexportSettings.setLayout(QVBoxLayout()) self.CBZactive = QCheckBox(i18n("Export to CBZ")) CBZexportSettings.layout().addWidget(self.CBZactive) self.CBZgroupResize = comic_export_resize_widget("CBZ") CBZexportSettings.layout().addWidget(self.CBZgroupResize) self.CBZactive.clicked.connect(self.CBZgroupResize.setEnabled) CBZgroupMeta = QGroupBox(i18n("Metadata to Add")) # CBZexportSettings.layout().addWidget(CBZgroupMeta) CBZgroupMeta.setLayout(QFormLayout()) mainWidget.addTab(CBZexportSettings, i18n("CBZ")) # ACBF, crop, resize, creator name, version history, panel layer, text layers. ACBFExportSettings = QWidget() ACBFform = QFormLayout() ACBFExportSettings.setLayout(QVBoxLayout()) ACBFdocInfo = QGroupBox() ACBFdocInfo.setTitle(i18n("ACBF Document Info")) ACBFdocInfo.setLayout(ACBFform) self.lnACBFSource = QLineEdit() self.lnACBFSource.setToolTip(i18n("Whether the acbf file is an adaption of an existing source, and if so, how to find information about that source. So for example, for an adapted webcomic, the official website url should go here.")) self.lnACBFID = QLabel() self.lnACBFID.setToolTip(i18n("By default this will be filled with a generated universal unique identifier. The ID by itself is merely so that comic book library management programs can figure out if this particular comic is already in their database and whether it has been rated. Of course, the UUID can be changed into something else by manually changing the JSON, but this is advanced usage.")) self.spnACBFVersion = QSpinBox() self.ACBFhistoryModel = QStandardItemModel() acbfHistoryList = QListView() acbfHistoryList.setModel(self.ACBFhistoryModel) btn_add_history = QPushButton(i18n("Add History Entry")) btn_add_history.clicked.connect(self.slot_add_history_item) self.chkIncludeTranslatorComments = QCheckBox() self.chkIncludeTranslatorComments.setText(i18n("Include translator's comments")) self.chkIncludeTranslatorComments.setToolTip(i18n("A PO file can contain translator's comments. If this is checked, the translations comments will be added as references into the ACBF file.")) self.lnTranslatorHeader = QLineEdit() ACBFform.addRow(i18n("Source:"), self.lnACBFSource) ACBFform.addRow(i18n("ACBF UID:"), self.lnACBFID) ACBFform.addRow(i18n("Version:"), self.spnACBFVersion) ACBFform.addRow(i18n("Version history:"), acbfHistoryList) ACBFform.addRow("", btn_add_history) ACBFform.addRow("", self.chkIncludeTranslatorComments) ACBFform.addRow(i18n("Translator header:"), self.lnTranslatorHeader) ACBFAuthorInfo = QWidget() acbfAVbox = QVBoxLayout(ACBFAuthorInfo) infoLabel = QLabel(i18n("The people responsible for the generation of the CBZ/ACBF files.")) infoLabel.setWordWrap(True) ACBFAuthorInfo.layout().addWidget(infoLabel) self.ACBFauthorModel = QStandardItemModel(0, 6) labels = [i18n("Nick Name"), i18n("Given Name"), i18n("Middle Name"), i18n("Family Name"), i18n("Email"), i18n("Homepage")] self.ACBFauthorModel.setHorizontalHeaderLabels(labels) self.ACBFauthorTable = QTableView() acbfAVbox.addWidget(self.ACBFauthorTable) self.ACBFauthorTable.setModel(self.ACBFauthorModel) self.ACBFauthorTable.verticalHeader().setDragEnabled(True) self.ACBFauthorTable.verticalHeader().setDropIndicatorShown(True) self.ACBFauthorTable.verticalHeader().setSectionsMovable(True) self.ACBFauthorTable.verticalHeader().sectionMoved.connect(self.slot_reset_author_row_visual) AuthorButtons = QHBoxLayout() btn_add_author = QPushButton(i18n("Add Author")) btn_add_author.clicked.connect(self.slot_add_author) AuthorButtons.addWidget(btn_add_author) btn_remove_author = QPushButton(i18n("Remove Author")) btn_remove_author.clicked.connect(self.slot_remove_author) AuthorButtons.addWidget(btn_remove_author) acbfAVbox.addLayout(AuthorButtons) ACBFStyle = QWidget() ACBFStyle.setLayout(QHBoxLayout()) self.ACBFStylesModel = QStandardItemModel() self.ACBFStyleClass = QListView() self.ACBFStyleClass.setModel(self.ACBFStylesModel) ACBFStyle.layout().addWidget(self.ACBFStyleClass) ACBFStyleEdit = QWidget() ACBFStyleEditVB = QVBoxLayout(ACBFStyleEdit) self.ACBFuseFont = QCheckBox(i18n("Use font")) self.ACBFFontList = QListView() self.ACBFFontList.setItemDelegate(font_list_delegate()) self.ACBFuseFont.toggled.connect(self.font_slot_enable_font_view) self.ACBFFontListModel = QStandardItemModel() self.ACBFFontListModel.rowsRemoved.connect(self.slot_font_current_style) self.ACBFFontListModel.itemChanged.connect(self.slot_font_current_style) self.btnAcbfAddFont = QPushButton() self.btnAcbfAddFont.setIcon(Application.icon("list-add")) self.btnAcbfAddFont.clicked.connect(self.font_slot_add_font) self.btn_acbf_remove_font = QPushButton() self.btn_acbf_remove_font.setIcon(Application.icon("edit-delete")) self.btn_acbf_remove_font.clicked.connect(self.font_slot_remove_font) self.ACBFFontList.setModel(self.ACBFFontListModel) self.ACBFdefaultFont = QComboBox() self.ACBFdefaultFont.addItems(["sans-serif", "serif", "monospace", "cursive", "fantasy"]) acbfFontButtons = QHBoxLayout() acbfFontButtons.addWidget(self.btnAcbfAddFont) acbfFontButtons.addWidget(self.btn_acbf_remove_font) self.ACBFBold = QCheckBox(i18n("Bold")) self.ACBFItal = QCheckBox(i18n("Italic")) self.ACBFStyleClass.clicked.connect(self.slot_set_style) self.ACBFStyleClass.selectionModel().selectionChanged.connect(self.slot_set_style) self.ACBFStylesModel.itemChanged.connect(self.slot_set_style) self.ACBFBold.toggled.connect(self.slot_font_current_style) self.ACBFItal.toggled.connect(self.slot_font_current_style) colorWidget = QGroupBox(self) colorWidget.setTitle(i18n("Text Colors")) colorWidget.setLayout(QVBoxLayout()) self.regularColor = QColorDialog() self.invertedColor = QColorDialog() self.btn_acbfRegColor = QPushButton(i18n("Regular Text"), self) self.btn_acbfRegColor.clicked.connect(self.slot_change_regular_color) self.btn_acbfInvColor = QPushButton(i18n("Inverted Text"), self) self.btn_acbfInvColor.clicked.connect(self.slot_change_inverted_color) colorWidget.layout().addWidget(self.btn_acbfRegColor) colorWidget.layout().addWidget(self.btn_acbfInvColor) ACBFStyleEditVB.addWidget(colorWidget) ACBFStyleEditVB.addWidget(self.ACBFuseFont) ACBFStyleEditVB.addWidget(self.ACBFFontList) ACBFStyleEditVB.addLayout(acbfFontButtons) ACBFStyleEditVB.addWidget(self.ACBFdefaultFont) ACBFStyleEditVB.addWidget(self.ACBFBold) ACBFStyleEditVB.addWidget(self.ACBFItal) ACBFStyleEditVB.addStretch() ACBFStyle.layout().addWidget(ACBFStyleEdit) ACBFTabwidget = QTabWidget() ACBFTabwidget.addTab(ACBFdocInfo, i18n("Document Info")) ACBFTabwidget.addTab(ACBFAuthorInfo, i18n("Author Info")) ACBFTabwidget.addTab(ACBFStyle, i18n("Style Sheet")) ACBFExportSettings.layout().addWidget(ACBFTabwidget) mainWidget.addTab(ACBFExportSettings, i18n("ACBF")) # Epub export, crop, resize, other questions. EPUBexportSettings = QWidget() EPUBexportSettings.setLayout(QVBoxLayout()) self.EPUBactive = QCheckBox(i18n("Export to EPUB")) EPUBexportSettings.layout().addWidget(self.EPUBactive) self.EPUBgroupResize = comic_export_resize_widget("EPUB") EPUBexportSettings.layout().addWidget(self.EPUBgroupResize) self.EPUBactive.clicked.connect(self.EPUBgroupResize.setEnabled) mainWidget.addTab(EPUBexportSettings, i18n("EPUB")) # For Print. Crop, no resize. TIFFExportSettings = QWidget() TIFFExportSettings.setLayout(QVBoxLayout()) self.TIFFactive = QCheckBox(i18n("Export to TIFF")) TIFFExportSettings.layout().addWidget(self.TIFFactive) self.TIFFgroupResize = comic_export_resize_widget("TIFF") TIFFExportSettings.layout().addWidget(self.TIFFgroupResize) self.TIFFactive.clicked.connect(self.TIFFgroupResize.setEnabled) mainWidget.addTab(TIFFExportSettings, i18n("TIFF"))
def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) #a_combobox = QWidgets.QComboBox() comboA = QtWidgets.QComboBox(self) comboB = QtWidgets.QComboBox(self) #comboA.setGeometry(QtCore.QRect(400, 180, 200, 50)) comboA.setGeometry(400, 200, 150, 80) comboB.setGeometry(20, 300, 220, 40) layoutA = QtWidgets.QVBoxLayout(comboA) layoutB = QtWidgets.QVBoxLayout(comboB) comboA.setStyleSheet("font: 20px; border-style: outset; border-width:0px ; border-color: rbg(128,128,128); color:rgb(0,0,0); background-color: rgb(255,255,255);"); comboB.setStyleSheet("font: 20px; border-style: outset; border-width:0px ; border-color: rbg(128,128,128); color:rgb(0,0,0); background-color: rgb(255,255,255);"); comboA.addItem("選擇連線硬體") comboA.addItem("Arduino") comboA.addItem("Circuit") comboA.addItem("ESP-8266") comboA.addItem("Picoboard") comboA.addItem("Raspberry Pi") comboB.addItem("選擇燒錄硬體") comboB.addItem("Arduino Uno") comboB.addItem("ESP-8266") comboB.addItem("Circuit") ##預設值 #comboA.setCurrentIndex(0) #print (comboA.currentText()) comboA.activated.connect(self.comboA_selectionchange) comboB.activated.connect(self.comboB_selectionchange) layoutA.addWidget(comboA) layoutB.addWidget(comboB) #label l_v = QLabel('v:'+version,self) #//版本號 l_v.resize(80,25) l_v.setStyleSheet("font: 12px; border-style: outset; color:rgb(255,0,255);"); l_v.move(20,20) l_A = QLabel("連接硬體功能",self) l_A.setAlignment(QtCore.Qt.AlignCenter) l_A.resize(150,35) l_A.setStyleSheet("font: 20px;text-align:center; color:rgb(255,255,255); background-color: rgb(233,0,125);"); l_A.move(400,300) l_B = QLabel('',self) l_B.setPixmap(self.pixmap) l_B.resize(300,160) l_B.move(350,10) l_C =QLabel('燒錄韌體',self) l_C.move(250,300) l_C.setAlignment(QtCore.Qt.AlignCenter) #//*置中*/ l_C.resize(120,35) l_C.setStyleSheet("font: 20px;text-align:center; color:rgb(255,255,255); background-color: rgb(233,0,125);"); l_D =QLabel('開始創作',self) l_D.setAlignment(QtCore.Qt.AlignLeft) l_D.resize(120,35) l_D.setStyleSheet("font: 16px; border-style: outset; border-width:0px ; border-color: rbg(128,128,128); color:rgb(174, 182, 191); "); l_D.move(600,175) l_E =QLabel('選擇硬體',self) l_E.setAlignment(QtCore.Qt.AlignLeft) l_E.resize(120,35) l_E.setStyleSheet("font: 16px; border-style: outset; border-width:0px ; border-color: rbg(128,128,128); color:rgb(174, 182, 191); "); l_E.move(400,175) l_F =QLabel('確認硬體',self) l_F.setAlignment(QtCore.Qt.AlignLeft) l_F.resize(120,35) l_F.setStyleSheet("font: 16px; border-style: outset; border-width:0px ; border-color: rbg(128,128,128); color:rgb(174, 182, 191); "); l_F.move(20,175) b_port = QPushButton("連接埠",self) b_port.resize(120,35) b_port.setStyleSheet("font: 20px;text-align:center; color:rgb(255,255,255); background-color: rgb(233,0,125);"); b_port.setToolTip("偵測設備port") b_port.move(250,200) b_port.clicked.connect(self.b_port_clicked) #l_B = QLabel("設備port",self) #l_B.move(164,10) #https://blog.csdn.net/jia666666/article/details/81624550 listviewA = QListView(self) listviewA.setStyleSheet("font: 20px; background-color: rgb(255,255,255);"); listviewA.resize(220,80) listviewA.move(20,200) slm=QStringListModel() ##port self.qList=serial_ports() ##listviewA.qList=['aaaa','bbbb','cccc'] slm.setStringList(self.qList) listviewA.setModel(slm) listviewA.clicked.connect(self.listviewA_clicked) b_class = QPushButton("OSEP課程資源",self) b_class.setStyleSheet("font: 20px;text-align:center; color:rgb(255,255,255); background-color: rgb(233,0,125);"); b_class.setToolTip("瀏覽器開啟OSEP課程資源") b_class.resize(150,35) b_class.move(600,200) b_class.clicked.connect(self.b_class_clicked) b_url = QPushButton("OSEP線上操作",self) b_url.setStyleSheet("font: 20px;text-align:center; color:rgb(255,255,255); background-color: rgb(233,0,125);"); b_url.setToolTip("瀏覽器開啟OSEP線上操作網站") b_url.resize(150,35) b_url.move(600,250) b_url.clicked.connect(self.b_url_clicked) b_offline = QPushButton("OSEP離線操作",self) b_offline.resize(150,35) b_offline.setStyleSheet("font: 20px;text-align:center; color:rgb(128,128,128); background-color: rgb(255,255,255);"); b_offline.setToolTip("OSEP離線操作") b_offline.move(600,300) b_offline.clicked.connect(self.b_offline_clicked) b_clear = QPushButton("重置OSEP",self) b_clear.setToolTip("clear python.exe") b_clear.resize(150,35) b_clear.setStyleSheet("font: 20px;text-align:center; color:rgb(128,128,128); background-color: rgb(255,255,255);"); b_clear.move(600,65) b_clear.clicked.connect(self.b_clear_clicked) b_about = QPushButton("關於OSEP",self) b_about.setToolTip("關於OSEP") b_about.resize(150,35) b_about.setStyleSheet("font: 20px; color: rgb(128,128,128); text-align::center; "); b_about.move(600,20) b_about.clicked.connect(self.b_about_clicked) self.show()
class Main(QWidget): def __init__(self, user, width=160, height=660): super().__init__() self.user = user self.lv = QListView(self) self.lv.setViewMode(QListView.ListMode) self.lv.setIconSize(QSize(30, 30)) # self.lb.setGridSize(QSize(30,30)) self.lv.resize(width, height) self.lv.setEditTriggers(QAbstractItemView.NoEditTriggers) self.lv.setResizeMode(QListView.Adjust) self.lv_model = QStandardItemModel() self.lv.setModel(self.lv_model) # self.lb_model.appendRow(QStandardItem(QIcon("./client/image/man.png"), "普通员工A")) # self.lb_model.appendRow(QStandardItem(QIcon("./client/image/woman.png"), "普通员工B")) self.lv.doubleClicked.connect(self.lv_clicked) MsgWorker().do_update = self.do_update self.query_all_users() def query_all_users(self): MsgWorker().send_msg(msg_lib.build_get_all_users_msg()) def do_update(self, all_users): self.all_users = all_users for user in self.all_users: self.lv_model.appendRow( QStandardItem(QIcon("./client/image/man.png"), user.nick_name)) # self.lb.insert(tk.END, user.nick_name) def lv_clicked(self, model_index): user = self.all_users[model_index.row()] self.chat_to({'mode': 'user', 'data': user}) def send(self): pass # val = self.sdTxt.get('1.0', tk.END) # MsgWorker().send_msg(val.encode()) # self.rcTxt.tag_config("tag_me", foreground="green") # self.rcTxt.insert(tk.INSERT, '我:%s'%val, ("tag_me")) chat_form = None def chat_to(self, user): if not self.chat_form: self.chat_form = Chat() self.chat_form.after_close = self.do_after_close self.chat_form.show() self.chat_form.chat_to(user) self.chat_form.setWindowState(self.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive) self.chat_form.raise_() self.chat_form.activateWindow() def do_after_close(self): self.chat_form = None def closeEvent(self, event): if self.chat_form: self.chat_form.close() MsgWorker().send_msg(msg_lib.build_logout_msg(self.user.name))
def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1127, 870) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget) self.horizontalLayoutWidget.setGeometry(QtCore.QRect(40, 10, 711, 25)) self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") self.horizontalLayout = QtWidgets.QHBoxLayout( self.horizontalLayoutWidget) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setObjectName("horizontalLayout") self.lineEdit_4 = QtWidgets.QLineEdit(self.horizontalLayoutWidget) self.lineEdit_4.setObjectName("lineEdit_4") self.horizontalLayout.addWidget(self.lineEdit_4) self.lineEdit_5 = QtWidgets.QLineEdit(self.horizontalLayoutWidget) self.lineEdit_5.setObjectName("lineEdit_5") self.horizontalLayout.addWidget(self.lineEdit_5) self.lineEdit_6 = QtWidgets.QLineEdit(self.horizontalLayoutWidget) self.lineEdit_6.setObjectName("lineEdit_6") self.horizontalLayout.addWidget(self.lineEdit_6) self.lineEdit_7 = QtWidgets.QLineEdit(self.horizontalLayoutWidget) self.lineEdit_7.setObjectName("lineEdit_7") self.horizontalLayout.addWidget(self.lineEdit_7) self.pushButton = QtWidgets.QPushButton(self.horizontalLayoutWidget) self.pushButton.setObjectName("pushButton") self.horizontalLayout.addWidget(self.pushButton) self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(70, 40, 61, 23)) self.pushButton_2.setObjectName("pushButton_2") self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setGeometry(QtCore.QRect(30, 40, 31, 20)) self.lineEdit.setMaxLength(2) self.lineEdit.setObjectName("lineEdit") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(290, 40, 54, 12)) self.label.setObjectName("label") self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_3.setGeometry(QtCore.QRect(330, 40, 31, 23)) self.pushButton_3.setObjectName("pushButton_3") self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_4.setGeometry(QtCore.QRect(380, 40, 31, 23)) self.pushButton_4.setObjectName("pushButton_4") self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_5.setGeometry(QtCore.QRect(420, 40, 41, 23)) self.pushButton_5.setObjectName("pushButton_5") self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_6.setGeometry(QtCore.QRect(470, 40, 41, 23)) self.pushButton_6.setObjectName("pushButton_6") self.pushButton_7 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_7.setGeometry(QtCore.QRect(530, 40, 41, 23)) self.pushButton_7.setObjectName("pushButton_7") self.pushButton_8 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_8.setGeometry(QtCore.QRect(590, 40, 41, 23)) self.pushButton_8.setObjectName("pushButton_8") self.pushButton_9 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_9.setGeometry(QtCore.QRect(650, 40, 41, 23)) self.pushButton_9.setObjectName("pushButton_9") self.pushButton_10 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_10.setGeometry(QtCore.QRect(710, 40, 41, 23)) self.pushButton_10.setObjectName("pushButton_10") self.pushButton_11 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_11.setGeometry(QtCore.QRect(770, 40, 41, 23)) self.pushButton_11.setObjectName("pushButton_11") self.pushButton_12 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_12.setGeometry(QtCore.QRect(830, 40, 41, 23)) self.pushButton_12.setObjectName("pushButton_12") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(890, 10, 91, 21)) font = QtGui.QFont() font.setPointSize(12) font.setBold(True) font.setWeight(75) self.label_2.setFont(font) self.label_2.setTextFormat(QtCore.Qt.PlainText) self.label_2.setScaledContents(False) self.label_2.setWordWrap(False) self.label_2.setObjectName("label_2") self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget) self.textBrowser.setGeometry(QtCore.QRect(290, 70, 381, 731)) self.textBrowser.setObjectName("textBrowser") self.textBrowser_2 = QtWidgets.QTextBrowser(self.centralwidget) self.textBrowser_2.setGeometry(QtCore.QRect(700, 70, 391, 731)) self.textBrowser_2.setObjectName("textBrowser_2") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(300, 810, 54, 12)) self.label_3.setObjectName("label_3") self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setGeometry(QtCore.QRect(770, 10, 54, 12)) self.label_4.setObjectName("label_4") self.comboBox = QtWidgets.QComboBox(self.centralwidget) self.comboBox.setGeometry(QtCore.QRect(190, 40, 69, 22)) self.comboBox.setObjectName("comboBox") self.lineEdit_8 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_8.setGeometry(QtCore.QRect(140, 40, 31, 20)) self.lineEdit_8.setMaxLength(1) self.lineEdit_8.setObjectName("lineEdit_8") self.listView = QtWidgets.QListView(self.centralwidget) self.listView.setEnabled(True) self.listView.setGeometry(QtCore.QRect(30, 70, 201, 731)) self.listView.setObjectName("listView") self.listModel = QStringListModel() listView = QListView() self.dds = ['无数据'] self.listModel.setStringList(self.dds) self.listView.setModel(self.listModel) self.listView.clicked.connect(self.checkItem) self.comboBox_2 = QtWidgets.QComboBox(self.centralwidget) self.comboBox_2.setGeometry(QtCore.QRect(430, 810, 69, 22)) self.comboBox_2.setObjectName("comboBox_2") self.comboBox_3 = QtWidgets.QComboBox(self.centralwidget) self.comboBox_3.setGeometry(QtCore.QRect(860, 810, 69, 22)) self.comboBox_3.setObjectName("comboBox_3") self.listView_2 = QtWidgets.QListView(self.centralwidget) self.listView_2.setGeometry(QtCore.QRect(240, 70, 31, 731)) self.listView_2.setObjectName("listView_2") self.listModel_2 = QStringListModel() self.dds_2 = ['无'] self.listModel_2.setStringList(self.dds_2) self.listView_2.setModel(self.listModel_2) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1127, 23)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) self.pushButton.clicked.connect(MainWindow.repaint) QtCore.QMetaObject.connectSlotsByName(MainWindow)
def __init__(self): QComboBox.__init__(self) listView = QListView() self.setView(listView) return
class MDIHistory(QWidget, _HalWidgetBase): def __init__(self, parent=None): super(MDIHistory, self).__init__(parent) self.setMinimumSize(QSize(200, 150)) self.setWindowTitle("PyQt5 editor test example") lay = QVBoxLayout() lay.setContentsMargins(0,0,0,0) self.setLayout(lay) self.list = QListView() self.list.setEditTriggers(QListView.NoEditTriggers) self.list.activated.connect(self.activated) self.list.setAlternatingRowColors(True) self.list.selectionChanged = self.selectionChanged self.model = QStandardItemModel(self.list) self.MDILine = MDILine() self.MDILine.soft_keyboard = False self.MDILine.line_up = self.line_up self.MDILine.line_down = self.line_down STATUS.connect('mdi-history-changed', self.reload) # add widgets lay.addWidget(self.list) lay.addWidget(self.MDILine) self.fp = os.path.expanduser(INFO.MDI_HISTORY_PATH) try: open(self.fp, 'r') except: open(self.fp, 'a+') LOG.debug('MDI History file created: {}'.format(self.fp)) self.reload() self.select_row('last') def _hal_init(self): STATUS.connect('state-off', lambda w: self.setEnabled(False)) STATUS.connect('state-estop', lambda w: self.setEnabled(False)) STATUS.connect('interp-idle', lambda w: self.setEnabled(STATUS.machine_is_on() and (STATUS.is_all_homed() or INFO.NO_HOME_REQUIRED))) STATUS.connect('interp-run', lambda w: self.setEnabled(not STATUS.is_auto_mode())) STATUS.connect('all-homed', lambda w: self.setEnabled(STATUS.machine_is_on())) def reload(self, w=None ): self.model.clear() try: with open(self.fp,'r') as inputfile: for line in inputfile: line = line.rstrip('\n') item = QStandardItem(line) self.model.appendRow(item) self.list.setModel(self.model) self.list.scrollToBottom() if self.MDILine.hasFocus(): self.select_row('last') except: LOG.debug('File path is not valid: {}'.format(fp)) def selectionChanged(self,old, new): cmd = self.getSelected() self.MDILine.setText(cmd) selectionModel = self.list.selectionModel() if selectionModel.hasSelection(): self.row = selectionModel.currentIndex().row() def getSelected(self): selected_indexes = self.list.selectedIndexes() selected_rows = [item.row() for item in selected_indexes] # iterates each selected row in descending order for selected_row in sorted(selected_rows, reverse=True): text = self.model.item(selected_row).text() return text def activated(self): cmd = self.getSelected() self.MDILine.setText(cmd) self.MDILine.submit() self.select_row('down') def run_command(self): self.MDILine.submit() self.select_row('last') def select_row(self, style): style = style.lower() selectionModel = self.list.selectionModel() parent = QModelIndex() self.rows = self.model.rowCount(parent) - 1 if style == 'last': self.row = self.rows elif style == 'up': if self.row > 0: self.row -= 1 else: self.row = 0 elif style == 'down': if self.row < self.rows: self.row += 1 else: self.row = self.rows else: return top = self.model.index(self.row, 0, parent) bottom = self.model.index(self.row, 0, parent) selectionModel.setCurrentIndex(top, QItemSelectionModel.Select | QItemSelectionModel.Rows) selection = QItemSelection(top, top) selectionModel.clearSelection() selectionModel.select(selection, QItemSelectionModel.Select) def line_up(self): self.select_row('up') def line_down(self): self.select_row('down') ######################################################################### # This is how designer can interact with our widget properties. # designer will show the pyqtProperty properties in the editor # it will use the get set and reset calls to do those actions ######################################################################### def set_soft_keyboard(self, data): self.MDILine.soft_keyboard = data def get_soft_keyboard(self): return self.MDILine.soft_keyboard def reset_soft_keyboard(self): self.MDILine.soft_keyboard = False # designer will show these properties in this order: soft_keyboard_option = pyqtProperty(bool, get_soft_keyboard, set_soft_keyboard, reset_soft_keyboard)
class VistaPrenotazioniCliente(QWidget): def __init__(self, email_cliente, parent=None): super(VistaPrenotazioniCliente, self).__init__(parent) self.controllore_lista_prenotazioni = ControlloreListaPrenotazioni() self.email_cliente = email_cliente self.v_layout = QVBoxLayout() self.label_prenotazioni = QLabel("Prenotazioni: ") self.label_prenotazioni.setFont(QFont("Times New Roman", 18)) self.v_layout.addWidget(self.label_prenotazioni) self.lista_prenotazioni = QListView() self.aggiorna_dati_prenotazioni() self.v_layout.addWidget(self.lista_prenotazioni) self.h_layout = QHBoxLayout() self.create_button("Nuova prenotazione", self.go_nuova_prenotazione, "background-color: rgb(0, 255, 0);") self.create_button("Apri prenotazione", self.apri_prenotazione, "background-color: rgb(170,180,255);") self.create_button("Elimina prenotazione", self.conferma_elimina_prenotazione, "background-color: rgb(255,0,0);") self.v_layout.addLayout(self.h_layout) self.setLayout(self.v_layout) self.resize(250, 500) self.setWindowTitle("Prenotazioni") #Crea un bottone con i parametri passati e lo aggiunge al layout dei bottoni def create_button(self, testo, comando, background_color): bottone = QPushButton(testo) bottone.setFont(QFont("Arial", 14)) bottone.setStyleSheet(background_color) bottone.clicked.connect(comando) self.h_layout.addWidget(bottone) #Funzione di callback che aggiorna i dati delle prenotazioni visualizzate def aggiorna_dati_prenotazioni(self): self.modello_lista_prenotazioni = QStandardItemModel() self.controllore_lista_prenotazioni = ControlloreListaPrenotazioni() for prenotazione in self.controllore_lista_prenotazioni.get_lista_prenotazioni_cliente(self.email_cliente): item = QStandardItem() item.setText("Prenotazione del " + prenotazione.data_inizio.strftime("%d/%m/%Y") + " - " + prenotazione.data_fine.strftime("%d/%m/%Y")) item.setEditable(False) item.setFont(QFont("Arial", 16)) self.modello_lista_prenotazioni.appendRow(item) self.lista_prenotazioni.setModel(self.modello_lista_prenotazioni) #Visualizza la finestra per creare una nuova prenotazione def go_nuova_prenotazione(self): self.vista_nuova_prenotazione = VistaNuovaPrenotazione(self.email_cliente, self.aggiorna_dati_prenotazioni) self.vista_nuova_prenotazione.show() #Viuslizza i dettagli della prenotazione selezionata, se non è stata selezionata alcuna prenotazione mostra un #messaggio di errore def apri_prenotazione(self): try: indice = self.lista_prenotazioni.selectedIndexes()[0].row() da_visualizzare = self.controllore_lista_prenotazioni.get_lista_prenotazioni_cliente(self.email_cliente)[indice] except: QMessageBox.critical(self, "Errore", "Seleziona la prenotazione da visualizzare", QMessageBox.Ok, QMessageBox.Ok) return self.vista_prenotazione = VistaPrenotazione(ControllorePrenotazione(da_visualizzare)) self.vista_prenotazione.show() #Chiede conferma dell'eliminazione di una prenotazione, in caso affermativo la cancella def conferma_elimina_prenotazione(self): try: indice = self.lista_prenotazioni.selectedIndexes()[0].row() da_eliminare = self.controllore_lista_prenotazioni.get_lista_prenotazioni_cliente(self.email_cliente)[indice] except: QMessageBox.critical(self, "Errore", "Seleziona la prenotazione da eliminare", QMessageBox.Ok,QMessageBox.Ok) return if da_eliminare.data_inizio < datetime.now(): QMessageBox.critical(self, "Errore", "Non puoi eliminare prenotazioni passate", QMessageBox.Ok, QMessageBox.Ok) return risposta = QMessageBox.question(self, "Elimina prenotazione", "Sei sicuro di voler elimare la prenotazione selezionata? \nPerderai la caparra versata", QMessageBox.Yes, QMessageBox.No) if risposta == QMessageBox.Yes: self.controllore_lista_prenotazioni.elimina_prenotazione_singola(self.email_cliente, da_eliminare.data_inizio) self.controllore_lista_prenotazioni.save_data() self.aggiorna_dati_prenotazioni() else: return
def main(args): app = QApplication(args) page = QSplitter() data = Model(1000, 10, page) selections = QItemSelectionModel(data) table = QTableView() table.setModel(data) table.setSelectionModel(selections) table.horizontalHeader().setSectionsMovable(True) table.verticalHeader().setSectionsMovable(True) # Set StaticContents to enable minimal repaints on resizes. table.viewport().setAttribute(Qt.WA_StaticContents) page.addWidget(table) tree = QTreeView() tree.setModel(data) tree.setSelectionModel(selections) tree.setUniformRowHeights(True) tree.header().setStretchLastSection(False) tree.viewport().setAttribute(Qt.WA_StaticContents) # Disable the focus rect to get minimal repaints when scrolling on Mac. tree.setAttribute(Qt.WA_MacShowFocusRect, False) page.addWidget(tree) list = QListView() list.setModel(data) list.setSelectionModel(selections) list.setViewMode(QListView.IconMode) list.setSelectionMode(QAbstractItemView.ExtendedSelection) list.setAlternatingRowColors(False) list.viewport().setAttribute(Qt.WA_StaticContents) list.setAttribute(Qt.WA_MacShowFocusRect, False) page.addWidget(list) page.setWindowIcon(QIcon(images_dir + '/interview.png')) page.setWindowTitle("Interview") page.show() return app.exec_()
class comic_export_setting_dialog(QDialog): acbfStylesList = ["speech", "commentary", "formal", "letter", "code", "heading", "audio", "thought", "sign", "sound", "emphasis", "strong"] def __init__(self): super().__init__() self.setLayout(QVBoxLayout()) self.setWindowTitle(i18n("Export Settings")) buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) mainWidget = QTabWidget() self.layout().addWidget(mainWidget) self.layout().addWidget(buttons) # Set basic crop settings # Set which layers to remove before export. mainExportSettings = QWidget() mainExportSettings.setLayout(QVBoxLayout()) groupExportCrop = QGroupBox(i18n("Crop Settings")) formCrop = QFormLayout() groupExportCrop.setLayout(formCrop) self.chk_toOutmostGuides = QCheckBox(i18n("Crop to outmost guides")) self.chk_toOutmostGuides.setChecked(True) self.chk_toOutmostGuides.setToolTip(i18n("This will crop to the outmost guides if possible and otherwise use the underlying crop settings.")) formCrop.addRow("", self.chk_toOutmostGuides) btn_fromSelection = QPushButton(i18n("Set Margins from Active Selection")) btn_fromSelection.clicked.connect(self.slot_set_margin_from_selection) # This doesn't work. formCrop.addRow("", btn_fromSelection) self.spn_marginLeft = QSpinBox() self.spn_marginLeft.setMaximum(99999) self.spn_marginLeft.setSuffix(" px") formCrop.addRow(i18n("Left:"), self.spn_marginLeft) self.spn_marginTop = QSpinBox() self.spn_marginTop.setMaximum(99999) self.spn_marginTop.setSuffix(" px") formCrop.addRow(i18n("Top:"), self.spn_marginTop) self.spn_marginRight = QSpinBox() self.spn_marginRight.setMaximum(99999) self.spn_marginRight.setSuffix(" px") formCrop.addRow(i18n("Right:"), self.spn_marginRight) self.spn_marginBottom = QSpinBox() self.spn_marginBottom.setMaximum(99999) self.spn_marginBottom.setSuffix(" px") formCrop.addRow(i18n("Bottom:"), self.spn_marginBottom) groupExportLayers = QGroupBox(i18n("Layers")) formLayers = QFormLayout() groupExportLayers.setLayout(formLayers) self.cmbLabelsRemove = labelSelector() formLayers.addRow(i18n("Label for removal:"), self.cmbLabelsRemove) self.ln_text_layer_name = QLineEdit() self.ln_text_layer_name.setToolTip(i18n("These are keywords that can be used to identify text layers. A layer only needs to contain the keyword to be recognized. Keywords should be comma separated.")) self.ln_panel_layer_name = QLineEdit() self.ln_panel_layer_name.setToolTip(i18n("These are keywords that can be used to identify panel layers. A layer only needs to contain the keyword to be recognized. Keywords should be comma separated.")) formLayers.addRow(i18n("Text Layer Key:"), self.ln_text_layer_name) formLayers.addRow(i18n("Panel Layer Key:"), self.ln_panel_layer_name) mainExportSettings.layout().addWidget(groupExportCrop) mainExportSettings.layout().addWidget(groupExportLayers) mainWidget.addTab(mainExportSettings, i18n("General")) # CBZ, crop, resize, which metadata to add. CBZexportSettings = QWidget() CBZexportSettings.setLayout(QVBoxLayout()) self.CBZactive = QCheckBox(i18n("Export to CBZ")) CBZexportSettings.layout().addWidget(self.CBZactive) self.CBZgroupResize = comic_export_resize_widget("CBZ") CBZexportSettings.layout().addWidget(self.CBZgroupResize) self.CBZactive.clicked.connect(self.CBZgroupResize.setEnabled) CBZgroupMeta = QGroupBox(i18n("Metadata to Add")) # CBZexportSettings.layout().addWidget(CBZgroupMeta) CBZgroupMeta.setLayout(QFormLayout()) mainWidget.addTab(CBZexportSettings, i18n("CBZ")) # ACBF, crop, resize, creator name, version history, panel layer, text layers. ACBFExportSettings = QWidget() ACBFform = QFormLayout() ACBFExportSettings.setLayout(QVBoxLayout()) ACBFdocInfo = QGroupBox() ACBFdocInfo.setTitle(i18n("ACBF Document Info")) ACBFdocInfo.setLayout(ACBFform) self.lnACBFSource = QLineEdit() self.lnACBFSource.setToolTip(i18n("Whether the acbf file is an adaption of an existing source, and if so, how to find information about that source. So for example, for an adapted webcomic, the official website url should go here.")) self.lnACBFID = QLabel() self.lnACBFID.setToolTip(i18n("By default this will be filled with a generated universal unique identifier. The ID by itself is merely so that comic book library management programs can figure out if this particular comic is already in their database and whether it has been rated. Of course, the UUID can be changed into something else by manually changing the JSON, but this is advanced usage.")) self.spnACBFVersion = QSpinBox() self.ACBFhistoryModel = QStandardItemModel() acbfHistoryList = QListView() acbfHistoryList.setModel(self.ACBFhistoryModel) btn_add_history = QPushButton(i18n("Add History Entry")) btn_add_history.clicked.connect(self.slot_add_history_item) self.chkIncludeTranslatorComments = QCheckBox() self.chkIncludeTranslatorComments.setText(i18n("Include translator's comments")) self.chkIncludeTranslatorComments.setToolTip(i18n("A PO file can contain translator's comments. If this is checked, the translations comments will be added as references into the ACBF file.")) self.lnTranslatorHeader = QLineEdit() ACBFform.addRow(i18n("Source:"), self.lnACBFSource) ACBFform.addRow(i18n("ACBF UID:"), self.lnACBFID) ACBFform.addRow(i18n("Version:"), self.spnACBFVersion) ACBFform.addRow(i18n("Version history:"), acbfHistoryList) ACBFform.addRow("", btn_add_history) ACBFform.addRow("", self.chkIncludeTranslatorComments) ACBFform.addRow(i18n("Translator header:"), self.lnTranslatorHeader) ACBFAuthorInfo = QWidget() acbfAVbox = QVBoxLayout(ACBFAuthorInfo) infoLabel = QLabel(i18n("The people responsible for the generation of the CBZ/ACBF files.")) infoLabel.setWordWrap(True) ACBFAuthorInfo.layout().addWidget(infoLabel) self.ACBFauthorModel = QStandardItemModel(0, 6) labels = [i18n("Nick Name"), i18n("Given Name"), i18n("Middle Name"), i18n("Family Name"), i18n("Email"), i18n("Homepage")] self.ACBFauthorModel.setHorizontalHeaderLabels(labels) self.ACBFauthorTable = QTableView() acbfAVbox.addWidget(self.ACBFauthorTable) self.ACBFauthorTable.setModel(self.ACBFauthorModel) self.ACBFauthorTable.verticalHeader().setDragEnabled(True) self.ACBFauthorTable.verticalHeader().setDropIndicatorShown(True) self.ACBFauthorTable.verticalHeader().setSectionsMovable(True) self.ACBFauthorTable.verticalHeader().sectionMoved.connect(self.slot_reset_author_row_visual) AuthorButtons = QHBoxLayout() btn_add_author = QPushButton(i18n("Add Author")) btn_add_author.clicked.connect(self.slot_add_author) AuthorButtons.addWidget(btn_add_author) btn_remove_author = QPushButton(i18n("Remove Author")) btn_remove_author.clicked.connect(self.slot_remove_author) AuthorButtons.addWidget(btn_remove_author) acbfAVbox.addLayout(AuthorButtons) ACBFStyle = QWidget() ACBFStyle.setLayout(QHBoxLayout()) self.ACBFStylesModel = QStandardItemModel() self.ACBFStyleClass = QListView() self.ACBFStyleClass.setModel(self.ACBFStylesModel) ACBFStyle.layout().addWidget(self.ACBFStyleClass) ACBFStyleEdit = QWidget() ACBFStyleEditVB = QVBoxLayout(ACBFStyleEdit) self.ACBFuseFont = QCheckBox(i18n("Use font")) self.ACBFFontList = QListView() self.ACBFFontList.setItemDelegate(font_list_delegate()) self.ACBFuseFont.toggled.connect(self.font_slot_enable_font_view) self.ACBFFontListModel = QStandardItemModel() self.ACBFFontListModel.rowsRemoved.connect(self.slot_font_current_style) self.ACBFFontListModel.itemChanged.connect(self.slot_font_current_style) self.btnAcbfAddFont = QPushButton() self.btnAcbfAddFont.setIcon(Application.icon("list-add")) self.btnAcbfAddFont.clicked.connect(self.font_slot_add_font) self.btn_acbf_remove_font = QPushButton() self.btn_acbf_remove_font.setIcon(Application.icon("edit-delete")) self.btn_acbf_remove_font.clicked.connect(self.font_slot_remove_font) self.ACBFFontList.setModel(self.ACBFFontListModel) self.ACBFdefaultFont = QComboBox() self.ACBFdefaultFont.addItems(["sans-serif", "serif", "monospace", "cursive", "fantasy"]) acbfFontButtons = QHBoxLayout() acbfFontButtons.addWidget(self.btnAcbfAddFont) acbfFontButtons.addWidget(self.btn_acbf_remove_font) self.ACBFBold = QCheckBox(i18n("Bold")) self.ACBFItal = QCheckBox(i18n("Italic")) self.ACBFStyleClass.clicked.connect(self.slot_set_style) self.ACBFStyleClass.selectionModel().selectionChanged.connect(self.slot_set_style) self.ACBFStylesModel.itemChanged.connect(self.slot_set_style) self.ACBFBold.toggled.connect(self.slot_font_current_style) self.ACBFItal.toggled.connect(self.slot_font_current_style) colorWidget = QGroupBox(self) colorWidget.setTitle(i18n("Text Colors")) colorWidget.setLayout(QVBoxLayout()) self.regularColor = QColorDialog() self.invertedColor = QColorDialog() self.btn_acbfRegColor = QPushButton(i18n("Regular Text"), self) self.btn_acbfRegColor.clicked.connect(self.slot_change_regular_color) self.btn_acbfInvColor = QPushButton(i18n("Inverted Text"), self) self.btn_acbfInvColor.clicked.connect(self.slot_change_inverted_color) colorWidget.layout().addWidget(self.btn_acbfRegColor) colorWidget.layout().addWidget(self.btn_acbfInvColor) ACBFStyleEditVB.addWidget(colorWidget) ACBFStyleEditVB.addWidget(self.ACBFuseFont) ACBFStyleEditVB.addWidget(self.ACBFFontList) ACBFStyleEditVB.addLayout(acbfFontButtons) ACBFStyleEditVB.addWidget(self.ACBFdefaultFont) ACBFStyleEditVB.addWidget(self.ACBFBold) ACBFStyleEditVB.addWidget(self.ACBFItal) ACBFStyleEditVB.addStretch() ACBFStyle.layout().addWidget(ACBFStyleEdit) ACBFTabwidget = QTabWidget() ACBFTabwidget.addTab(ACBFdocInfo, i18n("Document Info")) ACBFTabwidget.addTab(ACBFAuthorInfo, i18n("Author Info")) ACBFTabwidget.addTab(ACBFStyle, i18n("Style Sheet")) ACBFExportSettings.layout().addWidget(ACBFTabwidget) mainWidget.addTab(ACBFExportSettings, i18n("ACBF")) # Epub export, crop, resize, other questions. EPUBexportSettings = QWidget() EPUBexportSettings.setLayout(QVBoxLayout()) self.EPUBactive = QCheckBox(i18n("Export to EPUB")) EPUBexportSettings.layout().addWidget(self.EPUBactive) self.EPUBgroupResize = comic_export_resize_widget("EPUB") EPUBexportSettings.layout().addWidget(self.EPUBgroupResize) self.EPUBactive.clicked.connect(self.EPUBgroupResize.setEnabled) mainWidget.addTab(EPUBexportSettings, i18n("EPUB")) # For Print. Crop, no resize. TIFFExportSettings = QWidget() TIFFExportSettings.setLayout(QVBoxLayout()) self.TIFFactive = QCheckBox(i18n("Export to TIFF")) TIFFExportSettings.layout().addWidget(self.TIFFactive) self.TIFFgroupResize = comic_export_resize_widget("TIFF") TIFFExportSettings.layout().addWidget(self.TIFFgroupResize) self.TIFFactive.clicked.connect(self.TIFFgroupResize.setEnabled) mainWidget.addTab(TIFFExportSettings, i18n("TIFF")) # SVG, crop, resize, embed vs link. #SVGExportSettings = QWidget() #mainWidget.addTab(SVGExportSettings, i18n("SVG")) """ Add a history item to the acbf version history list. """ def slot_add_history_item(self): newItem = QStandardItem() newItem.setText(str(i18n("v{version}-in this version...")).format(version=str(self.spnACBFVersion.value()))) self.ACBFhistoryModel.appendRow(newItem) """ Get the margins by treating the active selection in a document as the trim area. This allows people to snap selections to a vector or something, and then get the margins. """ def slot_set_margin_from_selection(self): doc = Application.activeDocument() if doc is not None: if doc.selection() is not None: self.spn_marginLeft.setValue(doc.selection().x()) self.spn_marginTop.setValue(doc.selection().y()) self.spn_marginRight.setValue(doc.width() - (doc.selection().x() + doc.selection().width())) self.spn_marginBottom.setValue(doc.height() - (doc.selection().y() + doc.selection().height())) """ Add an author with default values initialised. """ def slot_add_author(self): listItems = [] listItems.append(QStandardItem(i18n("Anon"))) # Nick name listItems.append(QStandardItem(i18n("John"))) # First name listItems.append(QStandardItem()) # Middle name listItems.append(QStandardItem(i18n("Doe"))) # Last name listItems.append(QStandardItem()) # email listItems.append(QStandardItem()) # homepage self.ACBFauthorModel.appendRow(listItems) """ Remove the selected author from the author list. """ def slot_remove_author(self): self.ACBFauthorModel.removeRow(self.ACBFauthorTable.currentIndex().row()) """ Ensure that the drag and drop of authors doesn't mess up the labels. """ def slot_reset_author_row_visual(self): headerLabelList = [] for i in range(self.ACBFauthorTable.verticalHeader().count()): headerLabelList.append(str(i)) for i in range(self.ACBFauthorTable.verticalHeader().count()): logicalI = self.ACBFauthorTable.verticalHeader().logicalIndex(i) headerLabelList[logicalI] = str(i + 1) self.ACBFauthorModel.setVerticalHeaderLabels(headerLabelList) """ Set the style item to the gui item's style. """ def slot_set_style(self): index = self.ACBFStyleClass.currentIndex() if index.isValid(): item = self.ACBFStylesModel.item(index.row()) fontUsed = item.data(role=styleEnum.FONT) if fontUsed is not None: self.ACBFuseFont.setChecked(fontUsed) else: self.ACBFuseFont.setChecked(False) self.font_slot_enable_font_view() fontList = item.data(role=styleEnum.FONTLIST) self.ACBFFontListModel.clear() for font in fontList: NewItem = QStandardItem(font) NewItem.setEditable(True) self.ACBFFontListModel.appendRow(NewItem) self.ACBFdefaultFont.setCurrentText(str(item.data(role=styleEnum.FONTGENERIC))) bold = item.data(role=styleEnum.BOLD) if bold is not None: self.ACBFBold.setChecked(bold) else: self.ACBFBold.setChecked(False) italic = item.data(role=styleEnum.ITALIC) if italic is not None: self.ACBFItal.setChecked(italic) else: self.ACBFItal.setChecked(False) """ Set the gui items to the currently selected style. """ def slot_font_current_style(self): index = self.ACBFStyleClass.currentIndex() if index.isValid(): item = self.ACBFStylesModel.item(index.row()) fontList = [] for row in range(self.ACBFFontListModel.rowCount()): font = self.ACBFFontListModel.item(row) fontList.append(font.text()) item.setData(self.ACBFuseFont.isChecked(), role=styleEnum.FONT) item.setData(fontList, role=styleEnum.FONTLIST) item.setData(self.ACBFdefaultFont.currentText(), role=styleEnum.FONTGENERIC) item.setData(self.ACBFBold.isChecked(), role=styleEnum.BOLD) item.setData(self.ACBFItal.isChecked(), role=styleEnum.ITALIC) self.ACBFStylesModel.setItem(index.row(), item) """ Change the regular color """ def slot_change_regular_color(self): if (self.regularColor.exec_() == QDialog.Accepted): square = QPixmap(32, 32) square.fill(self.regularColor.currentColor()) self.btn_acbfRegColor.setIcon(QIcon(square)) """ change the inverted color """ def slot_change_inverted_color(self): if (self.invertedColor.exec_() == QDialog.Accepted): square = QPixmap(32, 32) square.fill(self.invertedColor.currentColor()) self.btn_acbfInvColor.setIcon(QIcon(square)) def font_slot_enable_font_view(self): self.ACBFFontList.setEnabled(self.ACBFuseFont.isChecked()) self.btn_acbf_remove_font.setEnabled(self.ACBFuseFont.isChecked()) self.btnAcbfAddFont.setEnabled(self.ACBFuseFont.isChecked()) self.ACBFdefaultFont.setEnabled(self.ACBFuseFont.isChecked()) if self.ACBFFontListModel.rowCount() < 2: self.btn_acbf_remove_font.setEnabled(False) def font_slot_add_font(self): NewItem = QStandardItem(QFont().family()) NewItem.setEditable(True) self.ACBFFontListModel.appendRow(NewItem) def font_slot_remove_font(self): index = self.ACBFFontList.currentIndex() if index.isValid(): self.ACBFFontListModel.removeRow(index.row()) if self.ACBFFontListModel.rowCount() < 2: self.btn_acbf_remove_font.setEnabled(False) """ Load the UI values from the config dictionary given. """ def setConfig(self, config): if "cropToGuides" in config.keys(): self.chk_toOutmostGuides.setChecked(config["cropToGuides"]) if "cropLeft" in config.keys(): self.spn_marginLeft.setValue(config["cropLeft"]) if "cropTop" in config.keys(): self.spn_marginTop.setValue(config["cropTop"]) if "cropRight" in config.keys(): self.spn_marginRight.setValue(config["cropRight"]) if "cropBottom" in config.keys(): self.spn_marginBottom.setValue(config["cropBottom"]) if "labelsToRemove" in config.keys(): self.cmbLabelsRemove.setLabels(config["labelsToRemove"]) if "textLayerNames" in config.keys(): self.ln_text_layer_name.setText(", ".join(config["textLayerNames"])) else: self.ln_text_layer_name.setText("text") if "panelLayerNames" in config.keys(): self.ln_panel_layer_name.setText(", ".join(config["panelLayerNames"])) else: self.ln_panel_layer_name.setText("panels") self.CBZgroupResize.set_config(config) if "CBZactive" in config.keys(): self.CBZactive.setChecked(config["CBZactive"]) self.EPUBgroupResize.set_config(config) if "EPUBactive" in config.keys(): self.EPUBactive.setChecked(config["EPUBactive"]) self.TIFFgroupResize.set_config(config) if "TIFFactive" in config.keys(): self.TIFFactive.setChecked(config["TIFFactive"]) if "acbfAuthor" in config.keys(): if isinstance(config["acbfAuthor"], list): for author in config["acbfAuthor"]: listItems = [] listItems.append(QStandardItem(author.get("nickname", ""))) listItems.append(QStandardItem(author.get("first-name", ""))) listItems.append(QStandardItem(author.get("initials", ""))) listItems.append(QStandardItem(author.get("last-name", ""))) listItems.append(QStandardItem(author.get("email", ""))) listItems.append(QStandardItem(author.get("homepage", ""))) self.ACBFauthorModel.appendRow(listItems) pass else: listItems = [] listItems.append(QStandardItem(config["acbfAuthor"])) # Nick name for i in range(0, 5): listItems.append(QStandardItem()) # First name self.ACBFauthorModel.appendRow(listItems) if "acbfSource" in config.keys(): self.lnACBFSource.setText(config["acbfSource"]) if "acbfID" in config.keys(): self.lnACBFID.setText(config["acbfID"]) else: self.lnACBFID.setText(QUuid.createUuid().toString()) if "acbfVersion" in config.keys(): self.spnACBFVersion.setValue(config["acbfVersion"]) if "acbfHistory" in config.keys(): for h in config["acbfHistory"]: item = QStandardItem() item.setText(h) self.ACBFhistoryModel.appendRow(item) if "acbfStyles" in config.keys(): styleDict = config.get("acbfStyles", {}) for key in self.acbfStylesList: keyDict = styleDict.get(key, {}) style = QStandardItem(key.title()) style.setCheckable(True) if key in styleDict.keys(): style.setCheckState(Qt.Checked) else: style.setCheckState(Qt.Unchecked) fontOn = False if "font" in keyDict.keys() or "genericfont" in keyDict.keys(): fontOn = True style.setData(fontOn, role=styleEnum.FONT) if "font" in keyDict: fontlist = keyDict["font"] if isinstance(fontlist, list): font = keyDict.get("font", QFont().family()) style.setData(font, role=styleEnum.FONTLIST) else: style.setData([fontlist], role=styleEnum.FONTLIST) else: style.setData([QFont().family()], role=styleEnum.FONTLIST) style.setData(keyDict.get("genericfont", "sans-serif"), role=styleEnum.FONTGENERIC) style.setData(keyDict.get("bold", False), role=styleEnum.BOLD) style.setData(keyDict.get("ital", False), role=styleEnum.ITALIC) self.ACBFStylesModel.appendRow(style) keyDict = styleDict.get("general", {}) self.regularColor.setCurrentColor(QColor(keyDict.get("color", "#000000"))) square = QPixmap(32, 32) square.fill(self.regularColor.currentColor()) self.btn_acbfRegColor.setIcon(QIcon(square)) keyDict = styleDict.get("inverted", {}) self.invertedColor.setCurrentColor(QColor(keyDict.get("color", "#FFFFFF"))) square.fill(self.invertedColor.currentColor()) self.btn_acbfInvColor.setIcon(QIcon(square)) else: for key in self.acbfStylesList: style = QStandardItem(key.title()) style.setCheckable(True) style.setCheckState(Qt.Unchecked) style.setData(False, role=styleEnum.FONT) style.setData(QFont().family(), role=styleEnum.FONTLIST) style.setData("sans-serif", role=styleEnum.FONTGENERIC) style.setData(False, role=styleEnum.BOLD) #Bold style.setData(False, role=styleEnum.ITALIC) #Italic self.ACBFStylesModel.appendRow(style) self.CBZgroupResize.setEnabled(self.CBZactive.isChecked()) self.lnTranslatorHeader.setText(config.get("translatorHeader", "Translator's Notes")) self.chkIncludeTranslatorComments.setChecked(config.get("includeTranslComment", False)) """ Store the GUI values into the config dictionary given. @return the config diactionary filled with new values. """ def getConfig(self, config): config["cropToGuides"] = self.chk_toOutmostGuides.isChecked() config["cropLeft"] = self.spn_marginLeft.value() config["cropTop"] = self.spn_marginTop.value() config["cropBottom"] = self.spn_marginRight.value() config["cropRight"] = self.spn_marginBottom.value() config["labelsToRemove"] = self.cmbLabelsRemove.getLabels() config["CBZactive"] = self.CBZactive.isChecked() config = self.CBZgroupResize.get_config(config) config["EPUBactive"] = self.EPUBactive.isChecked() config = self.EPUBgroupResize.get_config(config) config["TIFFactive"] = self.TIFFactive.isChecked() config = self.TIFFgroupResize.get_config(config) authorList = [] for row in range(self.ACBFauthorTable.verticalHeader().count()): logicalIndex = self.ACBFauthorTable.verticalHeader().logicalIndex(row) listEntries = ["nickname", "first-name", "initials", "last-name", "email", "homepage"] author = {} for i in range(len(listEntries)): entry = self.ACBFauthorModel.data(self.ACBFauthorModel.index(logicalIndex, i)) if entry is None: entry = " " if entry.isspace() is False and len(entry) > 0: author[listEntries[i]] = entry elif listEntries[i] in author.keys(): author.pop(listEntries[i]) authorList.append(author) config["acbfAuthor"] = authorList config["acbfSource"] = self.lnACBFSource.text() config["acbfID"] = self.lnACBFID.text() config["acbfVersion"] = self.spnACBFVersion.value() versionList = [] for r in range(self.ACBFhistoryModel.rowCount()): index = self.ACBFhistoryModel.index(r, 0) versionList.append(self.ACBFhistoryModel.data(index, Qt.DisplayRole)) config["acbfHistory"] = versionList acbfStylesDict = {} for row in range(0, self.ACBFStylesModel.rowCount()): entry = self.ACBFStylesModel.item(row) if entry.checkState() == Qt.Checked: key = entry.text().lower() style = {} if entry.data(role=styleEnum.FONT): font = entry.data(role=styleEnum.FONTLIST) if font is not None: style["font"] = font genericfont = entry.data(role=styleEnum.FONTGENERIC) if font is not None: style["genericfont"] = genericfont bold = entry.data(role=styleEnum.BOLD) if bold is not None: style["bold"] = bold italic = entry.data(role=styleEnum.ITALIC) if italic is not None: style["ital"] = italic acbfStylesDict[key] = style acbfStylesDict["general"] = {"color": self.regularColor.currentColor().name()} acbfStylesDict["inverted"] = {"color": self.invertedColor.currentColor().name()} config["acbfStyles"] = acbfStylesDict config["translatorHeader"] = self.lnTranslatorHeader.text() config["includeTranslComment"] = self.chkIncludeTranslatorComments.isChecked() # Turn this into something that retreives from a line-edit when string freeze is over. config["textLayerNames"] = self.ln_text_layer_name.text().split(",") config["panelLayerNames"] = self.ln_panel_layer_name.text().split(",") return config
def b_port_clicked(self): global listviewA listviewA = QListView(self) listviewA.setStyleSheet("font: 20px; background-color: rgb(255,255,255);"); listviewA.resize(220,80) listviewA.move(20,200) slm=QStringListModel() self.qList=serial_ports() slm.setStringList(self.qList) listviewA.setModel(slm) listviewA.clicked.connect(self.listviewA_clicked) listviewA.show() #self.show()
class FileManager(QWidget, _HalWidgetBase): def __init__(self, parent=None): super(FileManager, self).__init__(parent) self.title = 'Qtvcp File System View' self.left = 10 self.top = 10 self.width = 640 self.height = 480 self._last = 0 if INFO.PROGRAM_PREFIX is not None: self.user_path = os.path.expanduser(INFO.PROGRAM_PREFIX) else: self.user_path = (os.path.join(os.path.expanduser('~'), 'linuxcnc/nc_files')) user = os.path.split(os.path.expanduser('~') )[-1] self.media_path = (os.path.join('/media', user)) temp = [('User', self.user_path), ('Media', self.media_path)] self._jumpList = OrderedDict(temp) self.currentPath = None self.currentFolder = None self.PREFS_ = None self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) pasteBox = QHBoxLayout() self.textLine = QLineEdit() self.textLine.setToolTip('Current Director/selected File') self.pasteButton = QToolButton() self.pasteButton.setEnabled(False) self.pasteButton.setText('Paste') self.pasteButton.setToolTip('Copy file from copy path to current directory/file') self.pasteButton.clicked.connect(self.paste) self.pasteButton.hide() pasteBox.addWidget(self.textLine) pasteBox.addWidget(self.pasteButton) self.copyBox = QFrame() hbox = QHBoxLayout() hbox.setContentsMargins(0,0,0,0) self.copyLine = QLineEdit() self.copyLine.setToolTip('File path to copy from, when pasting') self.copyButton = QToolButton() self.copyButton.setText('Copy') self.copyButton.setToolTip('Record current file as copy path') self.copyButton.clicked.connect(self.recordCopyPath) hbox.addWidget(self.copyButton) hbox.addWidget(self.copyLine) self.copyBox.setLayout(hbox) self.copyBox.hide() self.model = QFileSystemModel() self.model.setRootPath(QDir.currentPath()) self.model.setFilter(QDir.AllDirs | QDir.NoDot | QDir.Files) self.model.setNameFilterDisables(False) self.model.rootPathChanged.connect(self.folderChanged) self.list = QListView() self.list.setModel(self.model) self.list.resize(640, 480) self.list.clicked[QModelIndex].connect(self.listClicked) self.list.activated.connect(self._getPathActivated) self.list.setAlternatingRowColors(True) self.list.hide() self.table = QTableView() self.table.setModel(self.model) self.table.resize(640, 480) self.table.clicked[QModelIndex].connect(self.listClicked) self.table.activated.connect(self._getPathActivated) self.table.setAlternatingRowColors(True) header = self.table.horizontalHeader() header.setSectionResizeMode(0, QHeaderView.Stretch) header.setSectionResizeMode(1, QHeaderView.ResizeToContents) header.setSectionResizeMode(3, QHeaderView.ResizeToContents) header.swapSections(1,3) header.setSortIndicator(1,Qt.AscendingOrder) self.table.setSortingEnabled(True) self.table.setColumnHidden(2, True) # type self.table.verticalHeader().setVisible(False) # row count header self.cb = QComboBox() self.cb.currentIndexChanged.connect(self.filterChanged) self.fillCombobox(INFO.PROGRAM_FILTERS_EXTENSIONS) self.cb.setMinimumSize(200,30) self.cb.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.button2 = QToolButton() self.button2.setText('User') self.button2.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.button2.setMinimumSize(60, 30) self.button2.setToolTip('Jump to User directory.\nLong press for Options.') self.button2.clicked.connect(self.onJumpClicked) self.button3 = QToolButton() self.button3.setText('Add Jump') self.button3.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.button3.setMinimumSize(60, 30) self.button3.setToolTip('Add current directory to jump button list') self.button3.clicked.connect(self.onActionClicked) self.settingMenu = QMenu(self) self.button2.setMenu(self.settingMenu) hbox = QHBoxLayout() hbox.addWidget(self.button2) hbox.addWidget(self.button3) hbox.insertStretch (2, stretch = 0) hbox.addWidget(self.cb) windowLayout = QVBoxLayout() windowLayout.addLayout(pasteBox) windowLayout.addWidget(self.copyBox) windowLayout.addWidget(self.list) windowLayout.addWidget(self.table) windowLayout.addLayout(hbox) self.setLayout(windowLayout) self.show() def _hal_init(self): if self.PREFS_: last_path = self.PREFS_.getpref('last_loaded_directory', self.user_path, str, 'BOOK_KEEPING') LOG.debug("lAST FILE PATH: {}".format(last_path)) if not last_path == '': self.updateDirectoryView(last_path) else: self.updateDirectoryView(self.user_path) # get all the saved jumplist paths temp = self.PREFS_.getall('FILEMANAGER_JUMPLIST') self._jumpList.update(temp) else: LOG.debug("lAST FILE PATH: {}".format(self.user_path)) self.updateDirectoryView(self.user_path) # install jump paths into toolbutton menu for i in self._jumpList: self.addAction(i) # set recorded columns sort settings self.SETTINGS_.beginGroup("FileManager-{}".format(self.objectName())) sect = self.SETTINGS_.value('sortIndicatorSection', type = int) order = self.SETTINGS_.value('sortIndicatorOrder', type = int) self.SETTINGS_.endGroup() if not None in(sect,order): self.table.horizontalHeader().setSortIndicator(sect,order) # when qtvcp closes this gets called # record jump list paths def _hal_cleanup(self): if self.PREFS_: for i, key in enumerate(self._jumpList): if i in(0,1): continue self.PREFS_.putpref(key, self._jumpList.get(key), str, 'FILEMANAGER_JUMPLIST') # record sorted columns h = self.table.horizontalHeader() self.SETTINGS_.beginGroup("FileManager-{}".format(self.objectName())) self.SETTINGS_.setValue('sortIndicatorSection', h.sortIndicatorSection()) self.SETTINGS_.setValue('sortIndicatorOrder', h.sortIndicatorOrder()) self.SETTINGS_.endGroup() ######################### # callbacks ######################### # add shown text and hidden filter data from the INI def fillCombobox(self, data): for i in data: self.cb.addItem(i[0],i[1]) def folderChanged(self, data): data = os.path.normpath(data) self.currentFolder = data self.textLine.setText(data) def updateDirectoryView(self, path, quiet = False): if os.path.exists(path): self.list.setRootIndex(self.model.setRootPath(path)) self.table.setRootIndex(self.model.setRootPath(path)) else: LOG.debug("Set directory view error - no such path {}".format(path)) if not quiet: STATUS.emit('error', LOW_ERROR, "File Manager error - No such path: {}".format(path)) # retrieve selected filter (it's held as QT.userData) def filterChanged(self, index): userdata = self.cb.itemData(index) self.model.setNameFilters(userdata) def listClicked(self, index): # the signal passes the index of the clicked item dir_path = os.path.normpath(self.model.filePath(index)) if self.model.fileInfo(index).isFile(): self.currentPath = dir_path self.textLine.setText(self.currentPath) return root_index = self.model.setRootPath(dir_path) self.list.setRootIndex(root_index) self.table.setRootIndex(root_index) def onUserClicked(self): self.showUserDir() def onMediaClicked(self): self.showMediaDir() # jump directly to a saved path shown on the button def onJumpClicked(self): data = self.button2.text() if data.upper() == 'MEDIA': self.showMediaDir() elif data.upper() == 'USER': self.showUserDir() else: temp = self._jumpList.get(data) if temp is not None: self.updateDirectoryView(temp) else: STATUS.emit('error', linuxcnc.OPERATOR_ERROR, 'file jumopath: {} not valid'.format(data)) log.debug('file jumopath: {} not valid'.format(data)) # jump directly to a saved path from the menu def jumpTriggered(self, data): if data.upper() == 'MEDIA': self.button2.setText('{}'.format(data)) self.button2.setToolTip('Jump to Media directory.\nLong press for Options.') self.showMediaDir() elif data.upper() == 'USER': self.button2.setText('{}'.format(data)) self.button2.setToolTip('Jump to User directory.\nLong press for Options.') self.showUserDir() else: self.button2.setText('{}'.format(data)) self.button2.setToolTip('Jump to directory:\n{}'.format(self._jumpList.get(data))) self.updateDirectoryView(self._jumpList.get(data)) # add a jump list path def onActionClicked(self): i = self.currentFolder try: self._jumpList[i] = i except Exception as e: print(e) button = QAction(QIcon.fromTheme('user-home'), i, self) # weird lambda i=i to work around 'function closure' button.triggered.connect(lambda state, i=i: self.jumpTriggered(i)) self.settingMenu.addAction(button) # get current selection and update the path # then if the path is good load it into linuxcnc # record it in the preference file if available def _getPathActivated(self): if self.list.isVisible(): row = self.list.selectionModel().currentIndex() else: row = self.table.selectionModel().currentIndex() self.listClicked(row) fname = self.currentPath if fname is None: return if fname: self.load(fname) def recordCopyPath(self): data, isFile = self.getCurrentSelected() if isFile: self.copyLine.setText(os.path.normpath(data)) self.pasteButton.setEnabled(True) else: self.copyLine.setText('') self.pasteButton.setEnabled(False) STATUS.emit('error', OPERATOR_ERROR, 'Can only copy a file, not a folder') def paste(self): res = self.copyFile(self.copyLine.text(), self.textLine.text()) if res: self.copyLine.setText('') self.pasteButton.setEnabled(False) ######################## # helper functions ######################## def addAction(self, i): axisButton = QAction(QIcon.fromTheme('user-home'), i, self) # weird lambda i=i to work around 'function closure' axisButton.triggered.connect(lambda state, i=i: self.jumpTriggered(i)) self.settingMenu.addAction(axisButton) def showList(self, state=True): if state: self.table.hide() self.list.show() else: self.table.show() self.list.hide() def showTable(self, state=True): self.showList(not state) def showCopyControls(self, state): if state: self.copyBox.show() self.pasteButton.show() else: self.copyBox.hide() self.pasteButton.hide() def showMediaDir(self, quiet = False): self.updateDirectoryView(self.media_path, quiet) def showUserDir(self, quiet = False): self.updateDirectoryView(self.user_path, quiet) def copyFile(self, s, d): try: shutil.copy(s, d) return True except Exception as e: LOG.error("Copy file error: {}".format(e)) STATUS.emit('error', OPERATOR_ERROR, "Copy file error: {}".format(e)) return False @pyqtSlot(float) @pyqtSlot(int) def scroll(self, data): if data > self._last: self.up() elif data < self._last: self.down() self._last = data # moves the selection up # used with MPG scrolling def up(self): self.select_row('up') # moves the selection down # used with MPG scrolling def down(self): self.select_row('down') def select_row(self, style='down'): style = style.lower() if self.list.isVisible(): i = self.list.rootIndex() selectionModel = self.list.selectionModel() else: i = self.table.rootIndex() selectionModel = self.table.selectionModel() row = selectionModel.currentIndex().row() self.rows = self.model.rowCount(i) if style == 'last': row = self.rows elif style == 'up': if row > 0: row -= 1 else: row = 0 elif style == 'down': if row < self.rows-1: row += 1 else: row = self.rows-1 else: return top = self.model.index(row, 0, i) selectionModel.setCurrentIndex(top, QItemSelectionModel.Select | QItemSelectionModel.Rows) selection = QItemSelection(top, top) selectionModel.clearSelection() selectionModel.select(selection, QItemSelectionModel.Select) # returns the current highlighted (selected) path as well as # whether it's a file or not. def getCurrentSelected(self): if self.list.isVisible(): selectionModel = self.list.selectionModel() else: selectionModel = self.table.selectionModel() index = selectionModel.currentIndex() dir_path = os.path.normpath(self.model.filePath(index)) if self.model.fileInfo(index).isFile(): return (dir_path, True) else: return (dir_path, False) # This can be class patched to do something else def load(self, fname=None): try: if fname is None: self._getPathActivated() return self.recordBookKeeping() ACTION.OPEN_PROGRAM(fname) STATUS.emit('update-machine-log', 'Loaded: ' + fname, 'TIME') except Exception as e: LOG.error("Load file error: {}".format(e)) STATUS.emit('error', NML_ERROR, "Load file error: {}".format(e)) # This can be class patched to do something else def recordBookKeeping(self): fname = self.currentPath if fname is None: return if self.PREFS_: self.PREFS_.putpref('last_loaded_directory', self.model.rootPath(), str, 'BOOK_KEEPING') self.PREFS_.putpref('RecentPath_0', fname, str, 'BOOK_KEEPING')
def __init__(self, playlist, parent=None): super(Player, self).__init__(parent) self.setStyleSheet(stylesheet(self)) self.colorDialog = None self.trackInfo = "" self.statusInfo = "" self.duration = 0 self.url = "" self. settings = QSettings("QAudioPlayer", "QAudioPlayer") self.player = QMediaPlayer() self.playlist = QMediaPlaylist() self.player.setPlaylist(self.playlist) self.player.durationChanged.connect(self.durationChanged) self.player.positionChanged.connect(self.positionChanged) self.player.metaDataChanged.connect(self.metaDataChanged) self.playlist.currentIndexChanged.connect(self.playlistPositionChanged) self.player.mediaStatusChanged.connect(self.statusChanged) self.player.bufferStatusChanged.connect(self.bufferingProgress) self.player.error.connect(self.displayErrorMessage) self.playlistModel = PlaylistModel() self.playlistModel.setPlaylist(self.playlist) self.playlistView = QListView() # self.playlistView.setSpacing(1) self.playlistView.setStyleSheet(stylesheet(self)) self.playlistView.setModel(self.playlistModel) self.playlistView.setCurrentIndex( self.playlistModel.index(self.playlist.currentIndex(), 0)) self.playlistView.activated.connect(self.jump) self.slider = QSlider(Qt.Horizontal) self.slider.setRange(0, self.player.duration() / 1000) self.slider.setStyleSheet(stylesheet(self)) self.labelDuration = QLabel() self.slider.sliderMoved.connect(self.seek) openButton = QPushButton("Open", clicked=self.open) openButton.setIcon(openButton.style().standardIcon(QStyle.SP_DialogOpenButton)) clearButton = QPushButton("", clicked=self.clearList) clearButton.setFixedWidth(36) clearButton.setIcon(QIcon.fromTheme("edit-delete")) clearButton.setToolTip("clear List") controls = PlayerControls() controls.setState(self.player.state()) controls.setVolume(self.player.volume()) controls.setMuted(controls.isMuted()) controls.play.connect(self.player.play) controls.pause.connect(self.player.pause) controls.stop.connect(self.player.stop) controls.next.connect(self.playlist.next) controls.previous.connect(self.previousClicked) controls.changeVolume.connect(self.player.setVolume) controls.changeMuting.connect(self.player.setMuted) controls.changeRate.connect(self.player.setPlaybackRate) self.player.stateChanged.connect(controls.setState) self.player.volumeChanged.connect(controls.setVolume) self.player.mutedChanged.connect(controls.setMuted) displayLayout = QHBoxLayout() displayLayout.addWidget(self.playlistView) controlLayout = QHBoxLayout() controlLayout.setContentsMargins(0, 0, 0, 0) controlLayout.addWidget(openButton) controlLayout.addWidget(clearButton) # controlLayout.addStretch(1) controlLayout.addWidget(controls) # controlLayout.addStretch(1) layout = QVBoxLayout() layout.addLayout(displayLayout) hLayout = QHBoxLayout() hLayout.addWidget(self.slider) hLayout.addWidget(self.labelDuration) layout.addLayout(hLayout) layout.addLayout(controlLayout) self.statusBar = QStatusBar() vlayout = QVBoxLayout() vlayout.addWidget(self.statusBar) layout.addLayout(vlayout) self.statusBar.showMessage("Welcome") self.setWindowTitle("QAudioPlayer") self.setMinimumSize(300, 200) # self.setBackgroundRole(QPalette.Window) self.setContentsMargins(0,0,0,0) self.setLayout(layout) self.readSettings() if not self.player.isAvailable(): QMessageBox.warning(self, "Service not available", "The QMediaPlayer object does not have a valid service.\n" "Please check the media service plugins are installed.") controls.setEnabled(False) self.playlistView.setEnabled(False) openButton.setEnabled(False) self.colorButton.setEnabled(False) self.fullScreenButton.setEnabled(False) self.metaDataChanged() self.addToPlaylist(playlist)
def createVmessSettingPanel(self): labelDetourTo = QLabel( self.translate("InboundVmessPanel", "Detour To InboundDetour: "), self) self.comboBoxInVmessInboundTags = QComboBox() self.checkBoxdisableInsecureEncryption = QCheckBox( self.translate("InboundVmessPanel", "Disable Insecure Encryption"), self) self.checkBoxdisableInsecureEncryption.setChecked(False) labelEmail = QLabel( self.translate("InboundVmessPanel", "Email: "), self) self.lineEditInVmessMail = QLineEdit() labelUIID = QLabel( self.translate("InboundVmessPanel", "UUID: "), self) self.lineEditInVmessUUID = QLineEdit() labelAlterID = QLabel( self.translate("InboundVmessPanel", "AlterID: "), self) labelLevel = QLabel( self.translate("InboundVmessPanel", "Level: "), self) self.btnInVmessGenerate = QPushButton( self.translate("InboundVmessPanel", "Generate UUID"), self) self.btnInVmessChange = QPushButton( self.translate("InboundVmessPanel", "Modify"), self) self.btnInVmessClear = QPushButton( self.translate("InboundVmessPanel", "Clear"), self) self.btnInVmessAdd = QPushButton( self.translate("InboundVmessPanel", "Add"), self) self.btnInVmessDelete = QPushButton( self.translate("InboundVmessPanel", "Delete"), self) self.spinBoxInVmessLevel = QSpinBox() self.spinBoxInVmessAlterID = QSpinBox() self.spinBoxInVmessAlterID.setRange(0, 65535) self.spinBoxInVmessLevel.setRange(0, 65535) self.spinBoxInVmessLevel.setValue(10) self.spinBoxInVmessAlterID.setValue(30) self.lineEditInVmessUUID.setInputMask("HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH; ") self.comboBoxInVmessInboundTags.setView(QListView()) #self.comboBoxInVmessInboundTags.setStyleSheet("QComboBox {min-width: 128px; }" "QComboBox QAbstractItemView::item {min-width: 128px; }") hboxDetourTo = QHBoxLayout() hboxDetourTo.addWidget(labelDetourTo) hboxDetourTo.addWidget(self.comboBoxInVmessInboundTags) #hboxDetourTo.addStretch() hboxID = QHBoxLayout() hboxID.addWidget(labelUIID) hboxID.addWidget(self.lineEditInVmessUUID) hboxID.addWidget(self.btnInVmessGenerate) hboxLevel = QHBoxLayout() hboxLevel.addWidget(labelLevel) hboxLevel.addWidget(self.spinBoxInVmessLevel) hboxLevel.addWidget(labelAlterID) hboxLevel.addWidget(self.spinBoxInVmessAlterID) hboxLevel.addStretch() hboxEmail = QHBoxLayout() hboxEmail.addWidget(labelEmail) hboxEmail.addWidget(self.lineEditInVmessMail) vboxInVmessBtn = QVBoxLayout() vboxInVmessBtn.addStretch() vboxInVmessBtn.addWidget(self.btnInVmessAdd) vboxInVmessBtn.addWidget(self.btnInVmessClear) vboxInVmessBtn.addWidget(self.btnInVmessChange) vboxInVmessBtn.addWidget(self.btnInVmessDelete) vboxSetting = QVBoxLayout() vboxSetting.addLayout(hboxID) vboxSetting.addLayout(hboxLevel) vboxSetting.addLayout(hboxEmail) self.tableWidgetInVmessUser = tableWidgetUser = QTableWidget(self) tableWidgetUser.setRowCount(0) tableWidgetUser.setColumnCount(4) tableWidgetUser.setHorizontalHeaderLabels(self.labelUserVmessPanel) tableWidgetUser.setSelectionMode(QAbstractItemView.SingleSelection) tableWidgetUser.setSelectionBehavior(QAbstractItemView.SelectRows) tableWidgetUser.setEditTriggers(QAbstractItemView.NoEditTriggers) tableWidgetUser.horizontalHeader().setStretchLastSection(True) hboxTableWidgetUser = QHBoxLayout() hboxTableWidgetUser.addWidget(tableWidgetUser) hboxTableWidgetUser.addLayout(vboxInVmessBtn) vboxSetting.addLayout(hboxTableWidgetUser) self.groupBoxClientsSetting = groupBoxClientsSetting = QGroupBox( self.translate("InboundVmessPanel", "Clients: "), self) groupBoxClientsSetting.setLayout(vboxSetting) groupBoxClientsSetting.setCheckable(True) groupBoxClientsSetting.setChecked(True) vboxVmessPanel = QVBoxLayout() vboxVmessPanel.addLayout(hboxDetourTo) vboxVmessPanel.addWidget(self.checkBoxdisableInsecureEncryption) vboxVmessPanel.addWidget(self.createVmessDefaultSettingPanel()) vboxVmessPanel.addWidget(groupBoxClientsSetting) if (v2rayshellDebug): self.__debugBtn = QPushButton("__debugTest", self) vboxVmessPanel.addWidget(self.__debugBtn) self.__debugBtn.clicked.connect(self.__debugTest) self.settingInboundVmessPanelFromJSONFile(self.inboundVmessJSONFile, True) groupBoxVmessPanel = QGroupBox( self.translate("InboundVmessPanel", "Vmess"), self) groupBoxVmessPanel.setLayout(vboxVmessPanel) self.createVmessPanelSignals() return groupBoxVmessPanel
class TeamChooserWidget(QWidget): def __init__(self, parent, on_next, league=None): super().__init__(parent) self.layout = QVBoxLayout() self.list_view = QListView() self.league = league self.model = TeamListModel(league) self.list_view.setModel(self.model) self.list_view.setSelectionMode(QAbstractItemView.MultiSelection) self.list_view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.list_view.customContextMenuRequested.connect(self.list_context_menu) self.layout.addWidget(self.list_view) self.team_add = AddItemWidget(self, "New Team Name: ", self.add_team, unavailable_options=self.model.all_team_names) self.layout.addWidget(self.team_add) self.button_h_layout = QHBoxLayout() self.button_cancel = QPushButton("Cancel") self.button_cancel.clicked.connect(self.on_cancel) self.button_next = QPushButton("Next") self.button_next.clicked.connect(on_next) self.button_h_layout.addWidget(self.button_cancel) self.button_h_layout.addWidget(self.button_next) self.layout.addLayout(self.button_h_layout) self.setLayout(self.layout) self.new_teams = [] def add_team(self, name): self.new_teams.append(name) team = Team.create(name=name) self.model.add_team(team) def list_context_menu(self, pos): self.listMenu = QMenu() current_index = self.list_view.currentIndex() select = self.listMenu.addAction("Select") select.triggered.connect( lambda: self.list_view.selectionModel().select(current_index, QtCore.QItemSelectionModel.Select) ) deselect = self.listMenu.addAction("Deselect") deselect.triggered.connect( lambda: self.list_view.selectionModel().select(current_index, QtCore.QItemSelectionModel.Deselect) ) delete = self.listMenu.addAction("Delete") delete.setDisabled(current_index.data() not in self.new_teams) delete.triggered.connect(lambda: self.model.delete_team(current_index.row())) parentPosition = self.list_view.mapToGlobal(QtCore.QPoint(0, 0)) self.listMenu.move(parentPosition + pos) self.listMenu.show() def on_cancel(self): self.model.delete_added_teams() self.window().close() def get_selected_teams(self): teams = [] for i in self.list_view.selectedIndexes(): teams.append(self.model.get_team(i.row())) return teams
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.biography = OrderedDict() self.family = OrderedDict() # create widgets self.classes_lbl = QLabel(self) self.class_list = QListView(self) self.add_class_btn = QPushButton(self) self.students_lbl = QLabel(self) self.faves_only_chb = QCheckBox(self) self.student_list = QListView(self) self.name_lbl = QLabel("Jane Wayne", self) self.sex_icon = QLabel(self) self.age_lbl = QLabel(self) self.birthday_lbl = QLabel(self) self.personality_lbl = QLabel(self) self.club_lbl = QLabel(self) self.location_lbl = QLabel(self) for key in ("age", "birthday", "personality", "club", "location"): self.biography[key] = QLabel(self) for key in ("father", "mother", "siblings"): self.family[key] = QLabel(self) self.grades_lbl = QLabel(self) self.grades_list = cmn.QProgressList( translation_context="school subjects", parent=self) for name in world.subjects(): self.grades_list.addBar(name) self.student_view = QGraphicsView(self) # create layout # classesbox = QVBoxLayout() # classesbox.addWidget(self.classes_lbl) # classesbox.addWidget(self.class_list) # classesbox.addWidget(self.add_class_btn) self.bio_form = QFormLayout() for key, field in self.biography.items(): self.bio_form.addRow(key, field) self.family_form = QFormLayout() for key, field in self.family.items(): self.family_form.addRow(key, field) layout = QGridLayout(self) layout.addWidget(self.classes_lbl, 0, 0) layout.addWidget(self.class_list, 1, 0, 3, 1) layout.addWidget(self.add_class_btn, 4, 0) # layout.addLayout(classesbox, 0, 0, -1, 1) layout.addWidget(self.students_lbl, 0, 1) layout.addWidget(self.faves_only_chb, 0, 2) layout.addWidget(self.student_list, 1, 1, -1, 2) layout.addWidget(self.name_lbl, 0, 3) layout.addWidget(self.sex_icon, 0, 4) layout.addLayout(self.bio_form, 1, 3) layout.addLayout(self.family_form, 1, 4) layout.addWidget(self.grades_lbl, 2, 3) layout.addWidget(self.grades_list, 3, 3, -1, 2) layout.addWidget(self.student_view, 0, 5, -1, 1) layout.setColumnStretch(0, 2) layout.setColumnStretch(1, 1) layout.setColumnStretch(2, 1) layout.setColumnStretch(3, 2) layout.setColumnStretch(4, 2) layout.setColumnStretch(5, 4) # configure widgets self.retranslateUi() sizepol = self.add_class_btn.sizePolicy() sizepol.setHorizontalPolicy(QSizePolicy.Fixed) self.add_class_btn.setSizePolicy(sizepol)
class LocationCompleterView(QWidget): def __init__(self): super().__init__(None) self._view = None # QListView self._delegate = None # LocationCompleterDelegate self._searchEnginesLayout = None # QHBoxLayout self._resizeHeight = -1 self._resizeTimer = None # QTimer self._forceResize = True self.setAttribute(Qt.WA_ShowWithoutActivating) self.setAttribute(Qt.WA_X11NetWmWindowTypeCombo) if gVar.app.platformName() == 'xcb': self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.BypassWindowManagerHint) else: self.setWindowFlags(Qt.Popup) layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) self._view = QListView(self) layout.addWidget(self._view) self._view.setUniformItemSizes(True) self._view.setEditTriggers(QAbstractItemView.NoEditTriggers) self._view.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self._view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self._view.setSelectionBehavior(QAbstractItemView.SelectRows) self._view.setSelectionMode(QAbstractItemView.SingleSelection) self._view.setMouseTracking(True) gVar.app.installEventFilter(self) self._delegate = LocationCompleterDelegate(self) self._view.setItemDelegate(self._delegate) searchFrame = QFrame(self) searchFrame.setFrameStyle(QFrame.StyledPanel | QFrame.Raised) searchLayout = QHBoxLayout(searchFrame) searchLayout.setContentsMargins(10, 4, 4, 4) searchSettingsButton = ToolButton(self) searchSettingsButton.setIcon(IconProvider.settingsIcon()) searchSettingsButton.setToolTip(_('Manage Search Engines')) searchSettingsButton.setAutoRaise(True) searchSettingsButton.setIconSize(QSize(16, 16)) searchSettingsButton.clicked.connect(self.searchEnginesDialogRequested) searchLabel = QLabel(_('Search with:')) self._searchEnginesLayout = QHBoxLayout() self._setupSearchEngines() gVar.app.searchEnginesManager().enginesChanged.connect( self._setupSearchEngines) searchLayout.addWidget(searchLabel) searchLayout.addLayout(self._searchEnginesLayout) searchLayout.addStretch() searchLayout.addWidget(searchSettingsButton) layout.addWidget(searchFrame) def model(self): ''' @return: QAbstractItemModel ''' return self._view.model() def setModel(self, model): ''' @param model QAbstractItemModel ''' self._view.setModel(model) def selectionModel(self): ''' @return: QItemSelectionModel ''' return self._view.selectionModel() def currentIndex(self): ''' @return: QModelIndex ''' return self._view.currentIndex() def setCurrentIndex(self, index): ''' @param index QModelIndex ''' self._view.setCurrentIndex(index) def adjustSize(self): maxItemsCount = 12 newHeight = self._view.sizeHintForRow(0) * min(maxItemsCount, self.model().rowCount()) if not self._resizeTimer: self._resizeTimer = QTimer(self) self._resizeTimer.setInterval(200) def func(): if self._resizeHeight > 0: self._view.setFixedHeight(self._resizeHeight) self.setFixedHeight(self.sizeHint().height()) self._resizeHeight = -1 self._resizeTimer.timeout.connect(func) if not self._forceResize: if newHeight == self._resizeHeight: return elif newHeight == self._view.height(): self._resizeHeight = -1 return elif newHeight < self._view.height(): self._resizeHeight = newHeight self._resizeTimer.start() return self._resizeHeight = -1 self._forceResize = False self._view.setFixedHeight(newHeight) self.setFixedHeight(self.sizeHint().height()) # override def eventFilter(self, obj, event): # noqa C901 ''' @param obj QObject @param event QEvent @return: bool ''' # Event filter based on QCompleter::eventFilter from qcompleter.cpp if obj == self or obj == self._view or not self.isVisible(): return False evtType = event.type() if obj == self._view.viewport(): if evtType == QEvent.MouseButtonRelease: # QMouseEvent e = event index = self._view.indexAt(e.pos()) if not index.isValid(): return False # Qt::MouseButton button = e.button() # Qt::KeyboardModifiers modifiers = e.modifiers() if button == Qt.LeftButton and modifiers == Qt.NoModifier: self.indexActivated.emit(index) return True if button == Qt.MiddleButton or (button == Qt.LeftButton and modifiers == Qt.ControlModifier): self.indexCtrlActivated.emit(index) return True if button == Qt.LeftButton and modifiers == Qt.ShiftModifier: self.indexShiftActivated.emit(index) return True return False if evtType == QEvent.KeyPress: # QKeyEvent keyEvent = event evtKey = keyEvent.key() modifiers = keyEvent.modifiers() index = self._view.currentIndex() item = self.model().index(0, 0) if item.data(LocationCompleterModel.VisitSearchItemRole): visitSearchIndex = item else: visitSearchIndex = QModelIndex() if (evtKey == Qt.Key_Up or evtKey == Qt.Key_Down) and \ self._view.currentIndex() != index: self._view.setCurrentIndex(index) # TODO: ? if evtKey in (Qt.Key_Return, Qt.Key_Enter): if index.isValid(): if modifiers == Qt.NoModifier or modifiers == Qt.KeypadModifier: self.indexActivated.emit(index) return True if modifiers == Qt.ControlModifier: self.indexCtrlActivated.emit(index) return True if modifiers == Qt.ShiftModifier: self.indexShiftActivated.emit(index) return True elif evtKey == Qt.Key_End: if modifiers & Qt.ControlModifier: self._view.setCurrentIndex(self.model().index( self.model().rowCount() - 1, 0)) return True else: self.close() elif evtKey == Qt.Key_Home: if modifiers & Qt.ControlModifier: self._view.setCurrentIndex(self.model().index(0, 0)) self._view.scrollToTop() return True else: self.close() elif evtKey == Qt.Key_Escape: self.close() return True elif evtKey == Qt.Key_F4: if modifiers == Qt.AltModifier: self.close() return False elif evtKey in (Qt.Key_Tab, Qt.Key_Backtab): if modifiers != Qt.NoModifier and modifiers != Qt.ShiftModifier: return False isBack = evtKey == Qt.Key_Backtab if evtKey == Qt.Key_Tab and modifiers == Qt.ShiftModifier: isBack = True ev = QKeyEvent(QKeyEvent.KeyPress, isBack and Qt.Key_Up or Qt.Key_Down, Qt.NoModifier) QApplication.sendEvent(self.focusProxy(), ev) return True elif evtKey in (Qt.Key_Up, Qt.Key_PageUp): if modifiers != Qt.NoModifier: return False step = evtKey == Qt.Key_PageUp and 5 or 1 if not index.isValid() or index == visitSearchIndex: rowCount = self.model().rowCount() lastIndex = self.model().index(rowCount - 1, 0) self._view.setCurrentIndex(lastIndex) elif index.row() == 0: self._view.setCurrentIndex(QModelIndex()) else: row = max(0, index.row() - step) self._view.setCurrentIndex(self.model().index(row, 0)) return True elif evtKey in (Qt.Key_Down, Qt.Key_PageDown): if modifiers != Qt.NoModifier: return False step = evtKey == Qt.Key_PageDown and 5 or 1 if not index.isValid(): firstIndex = self.model().index(0, 0) self._view.setCurrentIndex(firstIndex) elif index != visitSearchIndex and index.row( ) == self.model().rowCount() - 1: self._view.setCurrentIndex(visitSearchIndex) self._view.scrollToTop() else: row = min(self.model().rowCount() - 1, index.row() + step) self._view.setCurrentIndex(self.model().index(row, 0)) return True elif evtKey == Qt.Key_Delete: if index != visitSearchIndex and self._view.viewport().rect( ).contains(self._view.visualRect(index)): self.indexDeleteRequested.emit(index) return True elif evtKey == Qt.Key_Shift: self._delegate.setForceVisitItem(True) self._view.viewport().update() # end of switch evtKey if self.focusProxy(): self.focusProxy().event(keyEvent) return True elif evtType == QEvent.KeyRelease: if event.key() == Qt.Key_Shift: self._delegate.setForceVisitItem(False) self._view.viewport().update() return True elif evtType in (QEvent.Wheel, QEvent.MouseButtonPress): if not self.underMouse(): self.close() return False elif evtType == QEvent.FocusOut: # QFocusEvent focusEvent = event reason = focusEvent.reason() if reason != Qt.PopupFocusReason and reason != Qt.MouseFocusReason: self.close() elif evtType in (QEvent.Move, QEvent.Resize): w = obj if isinstance(w, QWidget) and w.isWindow() and self.focusProxy( ) and w == self.focusProxy().window(): self.close() # end of switch evtType return False # Q_SIGNALS closed = pyqtSignal() searchEnginesDialogRequested = pyqtSignal() loadRequested = pyqtSignal(LoadRequest) indexActivated = pyqtSignal(QModelIndex) indexCtrlActivated = pyqtSignal(QModelIndex) indexShiftActivated = pyqtSignal(QModelIndex) indexDeleteRequested = pyqtSignal(QModelIndex) # public Q_SLOTS: def close(self): self.hide() self._view.verticalScrollBar().setValue(0) self._delegate.setForceVisitItem(False) self._forceResize = True self.closed.emit() # private: def _setupSearchEngines(self): for idx in (range(self._searchEnginesLayout.count())): item = self._searchEnginesLayout.takeAt(0) item.deleteLater() engines = gVar.app.searchEnginesManager().allEngines() for engine in engines: button = ToolButton(self) button.setIcon(engine.icon) button.setToolTip(engine.name) button.setAutoRaise(True) button.setIconSize(QSize(16, 16)) def func(): text = self.model().index(0, 0).data( LocationCompleterModel.SearchStringRole) self.loadRequested.emit( gVar.app.searchEngineManager().searchResult(engine, text)) button.clicked.connect(func) self._searchEnginesLayout.addWidget(button)
class VistaListaManutenzioni(QWidget): def __init__(self, callback): super(VistaListaManutenzioni, self).__init__() # Funzione di richiamo della vista precedente self.callback = callback # Controller dell'attrezzatura importante per effettuare le varie funzioni self.controller_elenco_manutenzioni = ControllerElencoManutenzioni() # Layout usati per visualizzare e allineare l'intera vista self.layout_verticale = QVBoxLayout() self.layout_orizzontale = QHBoxLayout() # Lista manutenzioni self.vista_elenco = QListView() # Funzione standard che imposta uno sfondo immagine e un titolo nella attuale vista self.show_background("ELENCO MANUTENZIONI") # Spaziatura orizzontale self.layout_orizzontale.addSpacerItem(QSpacerItem(100, 0)) # Creazione e allineamento lista delle manutenzioni aggiornata vista_lista_aggiornata = self.aggiorna() self.layout_orizzontale.addWidget(vista_lista_aggiornata) # Configurazione e allineamento dei pulsanti self.show_pulsantiera() self.layout_orizzontale.addSpacerItem(QSpacerItem(150, 0)) # Configurazione finale del layout totale self.layout_verticale.addLayout(self.layout_orizzontale) self.layout_verticale.addSpacerItem(QSpacerItem(0, 400)) self.setLayout(self.layout_verticale) self.setWindowTitle('Elenco Manutenzioni') # Resetta la lista delle manutenzioni aggiungendo le eventuali modifiche, e gestione dei colori def aggiorna(self): vista_lista_model = QStandardItemModel(self.vista_elenco) for manutenzione in self.controller_elenco_manutenzioni.get_elenco_manutenzioni( ): item = QStandardItem() oggi = date.today() scadenza = manutenzione.get_prossima_scadenza() nome = manutenzione.get_nome() stringa = str(nome) # Colore della label cambia a seconda dell'urgenza della manutenzione if oggi > scadenza: item.setForeground(QColor(255, 0, 0)) stringa += " [URGENTE]" if scadenza == oggi: item.setForeground(QColor(255, 200, 0)) elif scadenza > oggi: item.setForeground(QColor(0, 255, 0)) item.setText(stringa) item.setEditable(False) item.setFont(QFont('Times New Roman', 25, 100)) item.setTextAlignment(Qt.AlignCenter) vista_lista_model.appendRow(item) self.vista_elenco.setModel(vista_lista_model) self.vista_elenco.setStyleSheet("background-color: black") return self.vista_elenco # Metodo che permette, cliccando il bottone "indietro", di tornare alla vista precedente def indietro(self): self.callback() self.controller_elenco_manutenzioni.salva_dati() self.close() # Impostazione dello sfondo e del titolo def show_background(self, stringa): # Settaggio e ridimensionamento dell'immagine di sfondo dell'attuale vista self.setFixedWidth(QDesktopWidget().width()) self.setFixedHeight(QDesktopWidget().height()) back_img = QImage("Data/Immagini/VistaListaManutenzioni.jpg") img = back_img.scaled(self.width(), self.height()) palette = QPalette() palette.setBrush(10, QBrush(img)) self.setPalette(palette) # Settaggio e allineamento del titolo della vista titolo = QLabel(stringa) titolo.setStyleSheet("color: white") titolo.setAlignment(Qt.AlignCenter) titolo.setFont(QFont('Times New Roman', 60)) self.layout_verticale.addSpacerItem( QSpacerItem(0, 50, QSizePolicy.Fixed, QSizePolicy.Fixed)) self.layout_verticale.addWidget(titolo) self.layout_verticale.addSpacerItem( QSpacerItem(0, 100, QSizePolicy.Fixed, QSizePolicy.Fixed)) # Metodo per creazione, stile e funzionamento dei bottoni indietro e apri def show_pulsantiera(self): # Layout interni utilizzati per l'allineamento dei tre pulsanti layout_pulsanti = QVBoxLayout() # Configurazione del pulsante Apri pulsante_apri = self.pulsante("Apri", self.manutenzione_selezionata) layout_pulsanti.addWidget(pulsante_apri) # Configurazione del pulsante Indietro pulsante_indietro = self.pulsante("Indietro", self.indietro) layout_pulsanti.addWidget(pulsante_indietro) # Inserimento e allineamento dei tre pulsanti del layout globale layout_pulsanti.addSpacerItem(QSpacerItem(0, 50)) self.layout_orizzontale.addLayout(layout_pulsanti) # Metodo interno per standardizzare e semplificare la creazione di un pulsante def pulsante(self, nome, call): pulsante = QPushButton(nome) pulsante.setFont(QFont('Times New Roman', 20, 100, True)) pulsante.setStyleSheet( 'QPushButton {background-color: orange; color: black;}') pulsante.setFixedSize(250, 100) pulsante.clicked.connect(call) return pulsante # Metodo che controlla che venga selezionata una manutenzione al click di "apri" def manutenzione_selezionata(self): try: selezionata = self.vista_elenco.selectedIndexes()[0].row() lista = self.controller_elenco_manutenzioni.get_elenco_manutenzioni( ) manutenzione = lista[selezionata] self.vista_informazioni_manutenzione = VistaManutenzione( manutenzione, self.controller_elenco_manutenzioni.salva_dati, self.aggiorna) self.vista_informazioni_manutenzione.show() except IndexError: QMessageBox.information( self, 'Attenzione!', 'Non hai selezionato nessuna manutenzione da visualizzare.', QMessageBox.Ok, QMessageBox.Ok) except: QMessageBox.critical( self, 'Errore!', 'Qualcosa è andato storto, riprova più tardi.', QMessageBox.Ok, QMessageBox.Ok)
class Player(QWidget): fullScreenChanged = pyqtSignal(bool) def __init__(self, playlist, parent=None): super(Player, self).__init__(parent) self.setStyleSheet(stylesheet(self)) self.colorDialog = None self.trackInfo = "" self.statusInfo = "" self.duration = 0 self.url = "" self. settings = QSettings("QAudioPlayer", "QAudioPlayer") self.player = QMediaPlayer() self.playlist = QMediaPlaylist() self.player.setPlaylist(self.playlist) self.player.durationChanged.connect(self.durationChanged) self.player.positionChanged.connect(self.positionChanged) self.player.metaDataChanged.connect(self.metaDataChanged) self.playlist.currentIndexChanged.connect(self.playlistPositionChanged) self.player.mediaStatusChanged.connect(self.statusChanged) self.player.bufferStatusChanged.connect(self.bufferingProgress) self.player.error.connect(self.displayErrorMessage) self.playlistModel = PlaylistModel() self.playlistModel.setPlaylist(self.playlist) self.playlistView = QListView() # self.playlistView.setSpacing(1) self.playlistView.setStyleSheet(stylesheet(self)) self.playlistView.setModel(self.playlistModel) self.playlistView.setCurrentIndex( self.playlistModel.index(self.playlist.currentIndex(), 0)) self.playlistView.activated.connect(self.jump) self.slider = QSlider(Qt.Horizontal) self.slider.setRange(0, self.player.duration() / 1000) self.slider.setStyleSheet(stylesheet(self)) self.labelDuration = QLabel() self.slider.sliderMoved.connect(self.seek) openButton = QPushButton("Open", clicked=self.open) openButton.setIcon(openButton.style().standardIcon(QStyle.SP_DialogOpenButton)) clearButton = QPushButton("", clicked=self.clearList) clearButton.setFixedWidth(36) clearButton.setIcon(QIcon.fromTheme("edit-delete")) clearButton.setToolTip("clear List") controls = PlayerControls() controls.setState(self.player.state()) controls.setVolume(self.player.volume()) controls.setMuted(controls.isMuted()) controls.play.connect(self.player.play) controls.pause.connect(self.player.pause) controls.stop.connect(self.player.stop) controls.next.connect(self.playlist.next) controls.previous.connect(self.previousClicked) controls.changeVolume.connect(self.player.setVolume) controls.changeMuting.connect(self.player.setMuted) controls.changeRate.connect(self.player.setPlaybackRate) self.player.stateChanged.connect(controls.setState) self.player.volumeChanged.connect(controls.setVolume) self.player.mutedChanged.connect(controls.setMuted) displayLayout = QHBoxLayout() displayLayout.addWidget(self.playlistView) controlLayout = QHBoxLayout() controlLayout.setContentsMargins(0, 0, 0, 0) controlLayout.addWidget(openButton) controlLayout.addWidget(clearButton) # controlLayout.addStretch(1) controlLayout.addWidget(controls) # controlLayout.addStretch(1) layout = QVBoxLayout() layout.addLayout(displayLayout) hLayout = QHBoxLayout() hLayout.addWidget(self.slider) hLayout.addWidget(self.labelDuration) layout.addLayout(hLayout) layout.addLayout(controlLayout) self.statusBar = QStatusBar() vlayout = QVBoxLayout() vlayout.addWidget(self.statusBar) layout.addLayout(vlayout) self.statusBar.showMessage("Welcome") self.setWindowTitle("QAudioPlayer") self.setMinimumSize(300, 200) # self.setBackgroundRole(QPalette.Window) self.setContentsMargins(0,0,0,0) self.setLayout(layout) self.readSettings() if not self.player.isAvailable(): QMessageBox.warning(self, "Service not available", "The QMediaPlayer object does not have a valid service.\n" "Please check the media service plugins are installed.") controls.setEnabled(False) self.playlistView.setEnabled(False) openButton.setEnabled(False) self.colorButton.setEnabled(False) self.fullScreenButton.setEnabled(False) self.metaDataChanged() self.addToPlaylist(playlist) def readSettings(self): if self.settings.contains("url"): self.url = self.settings.value("url") self.addToPlaylist(self.url) def writeSettings(self): self.settings.setValue("url", self.url) def closeEvent(self, event): print("writing settings") self.writeSettings() print("goodbye ...") event.accept() def open(self): fileNames, _ = QFileDialog.getOpenFileNames(self, "Open Files", "/home", "Audio Files *.mp3 *.m4a *.ogg *.wav *.m3u") if fileNames: self.url = fileNames self.addToPlaylist(fileNames) print("added Files to playlist") def openOnStart(self, name): fileInfo = QFileInfo(name) if fileInfo.exists(): url = QUrl.fromLocalFile(fileInfo.absoluteFilePath()) if fileInfo.suffix().lower() == 'm3u': self.playlist.load(url) else: self.playlist.addMedia(QMediaContent(url)) else: url = QUrl(name) if url.isValid(): self.playlist.addMedia(QMediaContent(url)) print("added Files to playlist") def clearList(self): self.playlist.clear() def addToPlaylist(self, fileNames): for name in fileNames: fileInfo = QFileInfo(name) if fileInfo.exists(): url = QUrl.fromLocalFile(fileInfo.absoluteFilePath()) if fileInfo.suffix().lower() == 'm3u': self.playlist.load(url) else: self.playlist.addMedia(QMediaContent(url)) else: url = QUrl(name) if url.isValid(): self.playlist.addMedia(QMediaContent(url)) def durationChanged(self, duration): duration /= 1000 self.duration = duration self.slider.setMaximum(duration) def positionChanged(self, progress): progress /= 1000 if not self.slider.isSliderDown(): self.slider.setValue(progress) self.updateDurationInfo(progress) def metaDataChanged(self): if self.player.isMetaDataAvailable(): self.setTrackInfo("%s - %s" % ( self.player.metaData(QMediaMetaData.AlbumArtist), self.player.metaData(QMediaMetaData.Title))) def previousClicked(self): # Go to the previous track if we are within the first 5 seconds of # playback. Otherwise, seek to the beginning. if self.player.position() <= 5000: self.playlist.previous() else: self.player.setPosition(0) def jump(self, index): if index.isValid(): self.playlist.setCurrentIndex(index.row()) self.player.play() def playlistPositionChanged(self, position): self.playlistView.setCurrentIndex( self.playlistModel.index(position, 0)) def seek(self, seconds): self.player.setPosition(seconds * 1000) def statusChanged(self, status): self.handleCursor(status) if status == QMediaPlayer.LoadingMedia: self.setStatusInfo("Loading...") elif status == QMediaPlayer.StalledMedia: self.setStatusInfo("Media Stalled") elif status == QMediaPlayer.EndOfMedia: QApplication.alert(self) elif status == QMediaPlayer.InvalidMedia: self.displayErrorMessage() else: self.setStatusInfo("") def handleCursor(self, status): if status in (QMediaPlayer.LoadingMedia, QMediaPlayer.BufferingMedia, QMediaPlayer.StalledMedia): self.setCursor(Qt.BusyCursor) else: self.unsetCursor() def bufferingProgress(self, progress): self.setStatusInfo("Buffering %d%" % progress) def setTrackInfo(self, info): self.trackInfo = info if self.statusInfo != "": self.statusBar.showMessage("%s | %s" % (self.trackInfo, self.statusInfo)) else: self.statusBar.showMessage(self.trackInfo) def setStatusInfo(self, info): self.statusInfo = info if self.statusInfo != "": self.statusBar.showMessage("%s | %s" % (self.trackInfo, self.statusInfo)) else: self.statusBar.showMessage(self.trackInfo) def displayErrorMessage(self): self.setStatusInfo(self.player.errorString()) def updateDurationInfo(self, currentInfo): duration = self.duration if currentInfo or duration: currentTime = QTime((currentInfo/3600)%60, (currentInfo/60)%60, currentInfo%60, (currentInfo*1000)%1000) totalTime = QTime((duration/3600)%60, (duration/60)%60, duration%60, (duration*1000)%1000); format = 'hh:mm:ss' if duration > 3600 else 'mm:ss' tStr = currentTime.toString(format) + " / " + totalTime.toString(format) else: tStr = "" self.labelDuration.setText(tStr)
def __init__(self): super().__init__(None) self._view = None # QListView self._delegate = None # LocationCompleterDelegate self._searchEnginesLayout = None # QHBoxLayout self._resizeHeight = -1 self._resizeTimer = None # QTimer self._forceResize = True self.setAttribute(Qt.WA_ShowWithoutActivating) self.setAttribute(Qt.WA_X11NetWmWindowTypeCombo) if gVar.app.platformName() == 'xcb': self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.BypassWindowManagerHint) else: self.setWindowFlags(Qt.Popup) layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) self._view = QListView(self) layout.addWidget(self._view) self._view.setUniformItemSizes(True) self._view.setEditTriggers(QAbstractItemView.NoEditTriggers) self._view.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self._view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self._view.setSelectionBehavior(QAbstractItemView.SelectRows) self._view.setSelectionMode(QAbstractItemView.SingleSelection) self._view.setMouseTracking(True) gVar.app.installEventFilter(self) self._delegate = LocationCompleterDelegate(self) self._view.setItemDelegate(self._delegate) searchFrame = QFrame(self) searchFrame.setFrameStyle(QFrame.StyledPanel | QFrame.Raised) searchLayout = QHBoxLayout(searchFrame) searchLayout.setContentsMargins(10, 4, 4, 4) searchSettingsButton = ToolButton(self) searchSettingsButton.setIcon(IconProvider.settingsIcon()) searchSettingsButton.setToolTip(_('Manage Search Engines')) searchSettingsButton.setAutoRaise(True) searchSettingsButton.setIconSize(QSize(16, 16)) searchSettingsButton.clicked.connect(self.searchEnginesDialogRequested) searchLabel = QLabel(_('Search with:')) self._searchEnginesLayout = QHBoxLayout() self._setupSearchEngines() gVar.app.searchEnginesManager().enginesChanged.connect( self._setupSearchEngines) searchLayout.addWidget(searchLabel) searchLayout.addLayout(self._searchEnginesLayout) searchLayout.addStretch() searchLayout.addWidget(searchSettingsButton) layout.addWidget(searchFrame)
mainLayout = QHBoxLayout(self) LeftWidget = QWidget(self) RightWidget = QWidget(self) BottomWidget = QWidget(self) LeftWidget.setLayout(self.LeftLay) RightWidget.setLayout(self.RightLay) BottomWidget.setLayout(self.BottomLay) self.HSplitter = QSplitter(Qt.Horizontal) self.HSplitter.addWidget(LeftWidget) self.HSplitter.addWidget(RightWidget) self.VSplitter = QSplitter(Qt.Vertical) self.VSplitter.addWidget(self.HSplitter) self.VSplitter.addWidget(BottomWidget) #self.HSplitter.setSizes([300,300]) #self.VSplitter.setSizes([300,500]) mainLayout.addWidget(self.VSplitter) self.setLayout(mainLayout) if __name__ == '__main__': app = QApplication(sys.argv) ex = MainWidget() ex.LeftLay.addWidget(QListView(ex)) ex.RightLay.addWidget(QTableView(ex)) ex.BottomLay.addWidget(QTableView(ex)) ex.show() sys.exit(app.exec_())
def __init__(self): super().__init__() self.spark_logo = " ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /__ / .__/\_,_/_/ /_/\_\ version {version} /_/".format( version=self.sc.version) for s in self.libraryListSource: s.flags = 0 self._cachedDocuments = {} self.infoBox = gui.widgetBox(self.controlArea, 'Info') gui.label( self.infoBox, self, "<p>Execute python script.</p><p>Input variables:<ul><li> " + \ "<li>".join(t for t in dir(self.Inputs) if isinstance(getattr(self.Inputs, t), widget.Input)) + \ "</ul></p><p>Output variables:<ul><li>" + \ "<li>".join(t for t in dir(self.Outputs) if isinstance(getattr(self.Outputs, t), widget.Output)) + \ "</ul></p>" ) self.libraryList = itemmodels.PyListModel( [], self, flags=Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable) self.libraryList.wrap(self.libraryListSource) self.controlBox = gui.widgetBox(self.controlArea, 'Library') self.controlBox.layout().setSpacing(1) self.libraryView = QListView( editTriggers=QListView.DoubleClicked | QListView.EditKeyPressed, sizePolicy=QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Preferred)) self.libraryView.setItemDelegate(ScriptItemDelegate(self)) self.libraryView.setModel(self.libraryList) self.libraryView.selectionModel().selectionChanged.connect( self.onSelectedScriptChanged) self.controlBox.layout().addWidget(self.libraryView) w = itemmodels.ModelActionsWidget() self.addNewScriptAction = action = QAction("+", self) action.setToolTip("Add a new script to the library") action.triggered.connect(self.onAddScript) w.addAction(action) action = QAction(unicodedata.lookup("MINUS SIGN"), self) action.setToolTip("Remove script from library") action.triggered.connect(self.onRemoveScript) w.addAction(action) action = QAction("Update", self) action.setToolTip("Save changes in the editor to library") action.setShortcut(QKeySequence(QKeySequence.Save)) action.triggered.connect(self.commitChangesToLibrary) w.addAction(action) action = QAction("More", self, toolTip="More actions") new_from_file = QAction("Import a script from a file", self) save_to_file = QAction("Save selected script to a file", self) save_to_file.setShortcut(QKeySequence(QKeySequence.SaveAs)) new_from_file.triggered.connect(self.onAddScriptFromFile) save_to_file.triggered.connect(self.saveScript) menu = QMenu(w) menu.addAction(new_from_file) menu.addAction(save_to_file) action.setMenu(menu) button = w.addAction(action) button.setPopupMode(QToolButton.InstantPopup) w.layout().setSpacing(1) self.controlBox.layout().addWidget(w) gui.auto_commit(self.controlArea, self, "auto_execute", "Execute") self.splitCanvas = QSplitter(Qt.Vertical, self.mainArea) self.mainArea.layout().addWidget(self.splitCanvas) self.defaultFont = defaultFont = "Monaco" if sys.platform == "darwin" else "Courier" self.textBox = gui.widgetBox(self, 'Python script') self.splitCanvas.addWidget(self.textBox) self.text = PythonScriptEditor(self) self.textBox.layout().addWidget(self.text) self.textBox.setAlignment(Qt.AlignVCenter) self.text.setTabStopWidth(4) self.text.modificationChanged[bool].connect(self.onModificationChanged) self.saveAction = action = QAction("&Save", self.text) action.setToolTip("Save script to file") action.setShortcut(QKeySequence(QKeySequence.Save)) action.setShortcutContext(Qt.WidgetWithChildrenShortcut) action.triggered.connect(self.saveScript) self.consoleBox = gui.widgetBox(self, 'Console') self.splitCanvas.addWidget(self.consoleBox) # self.console = PySparkConsole(self.__dict__, self, sc = self.sc) self.console = EmbedIPython(sc=self.sc, hc=self.hc, sqlContext=self.sqlContext, data=self.data, df=self.df, df1=self.df1, df2=self.df2, df3=self.df3, transformer=self.transformer, estimator=self.estimator, model=self.model) # self.console.shell.run_cell('%pylab qt') self.console.shell.run_cell( 'print("{sparklogo}")'.format(sparklogo=self.spark_logo)) self.consoleBox.layout().addWidget(self.console) self.consoleBox.setAlignment(Qt.AlignBottom) select_row(self.libraryView, self.currentScriptIndex) self.splitCanvas.setSizes([2, 1]) # if self.splitterState is not None: # self.splitCanvas.restoreState(QByteArray(self.splitterState)) # # self.splitCanvas.splitterMoved[int, int].connect(self.onSpliterMoved) self.controlArea.layout().addStretch(1) self.resize(800, 600)
def setupLayout(self, wid): # Auth related widget authlay = QHBoxLayout() hostLabel = QLabel('Host:') portLabel = QLabel('Port:') usernameLabel = QLabel('Username:'******'Password:'******'Connect', self) if self.debug: self.connectBtn.setEnabled(False) # self.connectBtn.setIcon(QApplication.style().standardIcon(QStyle.SP_DirIcon)) authlay.addWidget(hostLabel) authlay.addWidget(self.hostInput) authlay.addWidget(portLabel) authlay.addWidget(self.portInput) authlay.addWidget(usernameLabel) authlay.addWidget(self.usernameInput) authlay.addWidget(passwordLabel) authlay.addWidget(self.passwordInput) authlay.addWidget(self.connectBtn) # Show commands in this widget commandlay = QVBoxLayout() commandLabel = QLabel('Command Window') self.commandText = QTextEdit() commandlay.addWidget(commandLabel) commandlay.addWidget(self.commandText) # Show local file and remote file in this widget locallay = QVBoxLayout() localpathlay = QHBoxLayout() remotelay = QVBoxLayout() remotepathlay = QHBoxLayout() localfileLabel = QLabel('Local File') remotefileLabel = QLabel('Remote File') self.localfileLine = QLineEdit() self.remotefileLine = QLineEdit() self.localfileList = QListView() self.remotefileList = QListView() # self.localfileReload = QPushButton() # self.remotefileReload = QPushButton() # self.localfileReload.setIcon(QApplication.style().standardIcon(QStyle.SP_BrowserReload)) # self.remotefileReload.setIcon(QApplication.style().standardIcon(QStyle.SP_BrowserReload)) localpathlay.addWidget(localfileLabel) localpathlay.addWidget(self.localfileLine) # localpathlay.addWidget(self.localfileReload) remotepathlay.addWidget(remotefileLabel) remotepathlay.addWidget(self.remotefileLine) # remotepathlay.addWidget(self.remotefileReload) locallay.addLayout(localpathlay) locallay.addWidget(self.localfileList) remotelay.addLayout(remotepathlay) remotelay.addWidget(self.remotefileList) localframe = QFrame(self) localframe.setFrameShape(QFrame.StyledPanel) localframe.setLayout(locallay) remoteframe = QFrame(self) remoteframe.setFrameShape(QFrame.StyledPanel) remoteframe.setLayout(remotelay) filesplitter = QSplitter(Qt.Horizontal) filesplitter.addWidget(localframe) filesplitter.addWidget(remoteframe) self.tasklist = QListWidget(self) # Set overall layout vlay = QVBoxLayout() authframe = QFrame(self) authframe.setFrameShape(QFrame.StyledPanel) authframe.setLayout(authlay) commandframe = QFrame(self) commandframe.setFrameShape(QFrame.StyledPanel) commandframe.setLayout(commandlay) topsplitter = QSplitter(Qt.Vertical) topsplitter.addWidget(authframe) topsplitter.addWidget(commandframe) topsplitter.addWidget(filesplitter) topsplitter.addWidget(self.tasklist) vlay.addWidget(topsplitter) wid.setLayout(vlay)
def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) pasteBox = QHBoxLayout() self.textLine = QLineEdit() self.textLine.setToolTip('Current Director/selected File') self.pasteButton = QToolButton() self.pasteButton.setEnabled(False) self.pasteButton.setText('Paste') self.pasteButton.setToolTip('Copy file from copy path to current directory/file') self.pasteButton.clicked.connect(self.paste) self.pasteButton.hide() pasteBox.addWidget(self.textLine) pasteBox.addWidget(self.pasteButton) self.copyBox = QFrame() hbox = QHBoxLayout() hbox.setContentsMargins(0,0,0,0) self.copyLine = QLineEdit() self.copyLine.setToolTip('File path to copy from, when pasting') self.copyButton = QToolButton() self.copyButton.setText('Copy') self.copyButton.setToolTip('Record current file as copy path') self.copyButton.clicked.connect(self.recordCopyPath) hbox.addWidget(self.copyButton) hbox.addWidget(self.copyLine) self.copyBox.setLayout(hbox) self.copyBox.hide() self.model = QFileSystemModel() self.model.setRootPath(QDir.currentPath()) self.model.setFilter(QDir.AllDirs | QDir.NoDot | QDir.Files) self.model.setNameFilterDisables(False) self.model.rootPathChanged.connect(self.folderChanged) self.list = QListView() self.list.setModel(self.model) self.list.resize(640, 480) self.list.clicked[QModelIndex].connect(self.listClicked) self.list.activated.connect(self._getPathActivated) self.list.setAlternatingRowColors(True) self.list.hide() self.table = QTableView() self.table.setModel(self.model) self.table.resize(640, 480) self.table.clicked[QModelIndex].connect(self.listClicked) self.table.activated.connect(self._getPathActivated) self.table.setAlternatingRowColors(True) header = self.table.horizontalHeader() header.setSectionResizeMode(0, QHeaderView.Stretch) header.setSectionResizeMode(1, QHeaderView.ResizeToContents) header.setSectionResizeMode(3, QHeaderView.ResizeToContents) header.swapSections(1,3) header.setSortIndicator(1,Qt.AscendingOrder) self.table.setSortingEnabled(True) self.table.setColumnHidden(2, True) # type self.table.verticalHeader().setVisible(False) # row count header self.cb = QComboBox() self.cb.currentIndexChanged.connect(self.filterChanged) self.fillCombobox(INFO.PROGRAM_FILTERS_EXTENSIONS) self.cb.setMinimumSize(200,30) self.cb.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.button2 = QToolButton() self.button2.setText('User') self.button2.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.button2.setMinimumSize(60, 30) self.button2.setToolTip('Jump to User directory.\nLong press for Options.') self.button2.clicked.connect(self.onJumpClicked) self.button3 = QToolButton() self.button3.setText('Add Jump') self.button3.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.button3.setMinimumSize(60, 30) self.button3.setToolTip('Add current directory to jump button list') self.button3.clicked.connect(self.onActionClicked) self.settingMenu = QMenu(self) self.button2.setMenu(self.settingMenu) hbox = QHBoxLayout() hbox.addWidget(self.button2) hbox.addWidget(self.button3) hbox.insertStretch (2, stretch = 0) hbox.addWidget(self.cb) windowLayout = QVBoxLayout() windowLayout.addLayout(pasteBox) windowLayout.addWidget(self.copyBox) windowLayout.addWidget(self.list) windowLayout.addWidget(self.table) windowLayout.addLayout(hbox) self.setLayout(windowLayout) self.show()
def __init__(self, playlist, parent=None): super(Player, self).__init__(parent) self.colorDialog = None self.trackInfo = "" self.statusInfo = "" self.duration = 0 self.player = QMediaPlayer() self.playlist = QMediaPlaylist() self.player.setPlaylist(self.playlist) self.player.durationChanged.connect(self.durationChanged) self.player.positionChanged.connect(self.positionChanged) self.player.metaDataChanged.connect(self.metaDataChanged) self.playlist.currentIndexChanged.connect(self.playlistPositionChanged) self.player.mediaStatusChanged.connect(self.statusChanged) self.player.bufferStatusChanged.connect(self.bufferingProgress) self.player.videoAvailableChanged.connect(self.videoAvailableChanged) self.player.error.connect(self.displayErrorMessage) self.videoWidget = VideoWidget() self.player.setVideoOutput(self.videoWidget) self.playlistModel = PlaylistModel() self.playlistModel.setPlaylist(self.playlist) self.playlistView = QListView() self.playlistView.setModel(self.playlistModel) self.playlistView.setCurrentIndex( self.playlistModel.index(self.playlist.currentIndex(), 0)) self.playlistView.activated.connect(self.jump) self.slider = QSlider(Qt.Horizontal) self.slider.setRange(0, self.player.duration() / 1000) self.labelDuration = QLabel() self.slider.sliderMoved.connect(self.seek) self.labelHistogram = QLabel() self.labelHistogram.setText("Histogram:") self.histogram = HistogramWidget() histogramLayout = QHBoxLayout() histogramLayout.addWidget(self.labelHistogram) histogramLayout.addWidget(self.histogram, 1) self.probe = QVideoProbe() self.probe.videoFrameProbed.connect(self.histogram.processFrame) self.probe.setSource(self.player) openButton = QPushButton("Open", clicked=self.open) controls = PlayerControls() controls.setState(self.player.state()) controls.setVolume(self.player.volume()) controls.setMuted(controls.isMuted()) controls.play.connect(self.player.play) controls.pause.connect(self.player.pause) controls.stop.connect(self.player.stop) controls.next.connect(self.playlist.next) controls.previous.connect(self.previousClicked) controls.changeVolume.connect(self.player.setVolume) controls.changeMuting.connect(self.player.setMuted) controls.changeRate.connect(self.player.setPlaybackRate) controls.stop.connect(self.videoWidget.update) self.player.stateChanged.connect(controls.setState) self.player.volumeChanged.connect(controls.setVolume) self.player.mutedChanged.connect(controls.setMuted) self.fullScreenButton = QPushButton("FullScreen") self.fullScreenButton.setCheckable(True) self.colorButton = QPushButton("Color Options...") self.colorButton.setEnabled(False) self.colorButton.clicked.connect(self.showColorDialog) displayLayout = QHBoxLayout() displayLayout.addWidget(self.videoWidget, 2) displayLayout.addWidget(self.playlistView) controlLayout = QHBoxLayout() controlLayout.setContentsMargins(0, 0, 0, 0) controlLayout.addWidget(openButton) controlLayout.addStretch(1) controlLayout.addWidget(controls) controlLayout.addStretch(1) controlLayout.addWidget(self.fullScreenButton) controlLayout.addWidget(self.colorButton) layout = QVBoxLayout() layout.addLayout(displayLayout) hLayout = QHBoxLayout() hLayout.addWidget(self.slider) hLayout.addWidget(self.labelDuration) layout.addLayout(hLayout) layout.addLayout(controlLayout) layout.addLayout(histogramLayout) self.setLayout(layout) if not self.player.isAvailable(): QMessageBox.warning(self, "Service not available", "The QMediaPlayer object does not have a valid service.\n" "Please check the media service plugins are installed.") controls.setEnabled(False) self.playlistView.setEnabled(False) openButton.setEnabled(False) self.colorButton.setEnabled(False) self.fullScreenButton.setEnabled(False) self.metaDataChanged() self.addToPlaylist(playlist)
class OWPySparkScript(SparkEnvironment, widget.OWWidget): priority = 3 name = "PySpark Script" description = "Write a PySpark script and run it on input" icon = "../icons/PythonScript.svg" class Inputs: df = widget.Input('df', pyspark.sql.DataFrame, default=True) df1 = widget.Input('df1', pyspark.sql.DataFrame) df2 = widget.Input('df2', pyspark.sql.DataFrame) df3 = widget.Input('df3', pyspark.sql.DataFrame) transformer = widget.Input('transformer', pyspark.ml.Transformer) estimator = widget.Input('transformer', pyspark.ml.Estimator) model = widget.Input('model', pyspark.ml.Model) data = widget.Input('data', object) class Outputs: df = widget.Output('df', pyspark.sql.DataFrame, default=True) df1 = widget.Output('df1', pyspark.sql.DataFrame) df2 = widget.Output('df2', pyspark.sql.DataFrame) df3 = widget.Output('df3', pyspark.sql.DataFrame) transformer = widget.Output('transformer', pyspark.ml.Transformer) estimator = widget.Output('transformer', pyspark.ml.Estimator) model = widget.Output('model', pyspark.ml.Model) data = widget.Output('data', object) # inputs = [("in_object", object, "setObject")] # outputs = [("out_object", object, widget.Dynamic)] df = None df1 = None df2 = None df3 = None transformer = None estimator = None model = None data = None libraryListSource = Setting( [Script("Hello world", "print('Hello world')\n")]) currentScriptIndex = Setting(0) splitterState = Setting(None) auto_execute = Setting(False) _script = Setting("") @Inputs.data def set_data(self, obj): self.data = obj self.console.shell.push({'data': self.data}) @Inputs.df def set_df(self, df): self.df = df self.console.shell.push({'df': self.df}) @Inputs.df1 def set_df1(self, df): self.df1 = df self.console.shell.push({'df1': self.df1}) @Inputs.df2 def set_df2(self, df): self.df2 = df self.console.shell.push({'df2': self.df2}) @Inputs.df3 def set_df3(self, df): self.df3 = df self.console.shell.push({'df3': self.df3}) @Inputs.transformer def set_transformer(self, transformer): self.transformer = transformer self.console.shell.push({'transformer': self.transformer}) @Inputs.estimator def set_estimator(self, estimator): self.estimator = estimator self.console.shell.push({'estimator': self.estimator}) @Inputs.model def set_model(self, model): self.model = model self.console.shell.push({'model': self.model}) def __init__(self): super().__init__() self.spark_logo = " ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /__ / .__/\_,_/_/ /_/\_\ version {version} /_/".format( version=self.sc.version) for s in self.libraryListSource: s.flags = 0 self._cachedDocuments = {} self.infoBox = gui.widgetBox(self.controlArea, 'Info') gui.label( self.infoBox, self, "<p>Execute python script.</p><p>Input variables:<ul><li> " + \ "<li>".join(t for t in dir(self.Inputs) if isinstance(getattr(self.Inputs, t), widget.Input)) + \ "</ul></p><p>Output variables:<ul><li>" + \ "<li>".join(t for t in dir(self.Outputs) if isinstance(getattr(self.Outputs, t), widget.Output)) + \ "</ul></p>" ) self.libraryList = itemmodels.PyListModel( [], self, flags=Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable) self.libraryList.wrap(self.libraryListSource) self.controlBox = gui.widgetBox(self.controlArea, 'Library') self.controlBox.layout().setSpacing(1) self.libraryView = QListView( editTriggers=QListView.DoubleClicked | QListView.EditKeyPressed, sizePolicy=QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Preferred)) self.libraryView.setItemDelegate(ScriptItemDelegate(self)) self.libraryView.setModel(self.libraryList) self.libraryView.selectionModel().selectionChanged.connect( self.onSelectedScriptChanged) self.controlBox.layout().addWidget(self.libraryView) w = itemmodels.ModelActionsWidget() self.addNewScriptAction = action = QAction("+", self) action.setToolTip("Add a new script to the library") action.triggered.connect(self.onAddScript) w.addAction(action) action = QAction(unicodedata.lookup("MINUS SIGN"), self) action.setToolTip("Remove script from library") action.triggered.connect(self.onRemoveScript) w.addAction(action) action = QAction("Update", self) action.setToolTip("Save changes in the editor to library") action.setShortcut(QKeySequence(QKeySequence.Save)) action.triggered.connect(self.commitChangesToLibrary) w.addAction(action) action = QAction("More", self, toolTip="More actions") new_from_file = QAction("Import a script from a file", self) save_to_file = QAction("Save selected script to a file", self) save_to_file.setShortcut(QKeySequence(QKeySequence.SaveAs)) new_from_file.triggered.connect(self.onAddScriptFromFile) save_to_file.triggered.connect(self.saveScript) menu = QMenu(w) menu.addAction(new_from_file) menu.addAction(save_to_file) action.setMenu(menu) button = w.addAction(action) button.setPopupMode(QToolButton.InstantPopup) w.layout().setSpacing(1) self.controlBox.layout().addWidget(w) gui.auto_commit(self.controlArea, self, "auto_execute", "Execute") self.splitCanvas = QSplitter(Qt.Vertical, self.mainArea) self.mainArea.layout().addWidget(self.splitCanvas) self.defaultFont = defaultFont = "Monaco" if sys.platform == "darwin" else "Courier" self.textBox = gui.widgetBox(self, 'Python script') self.splitCanvas.addWidget(self.textBox) self.text = PythonScriptEditor(self) self.textBox.layout().addWidget(self.text) self.textBox.setAlignment(Qt.AlignVCenter) self.text.setTabStopWidth(4) self.text.modificationChanged[bool].connect(self.onModificationChanged) self.saveAction = action = QAction("&Save", self.text) action.setToolTip("Save script to file") action.setShortcut(QKeySequence(QKeySequence.Save)) action.setShortcutContext(Qt.WidgetWithChildrenShortcut) action.triggered.connect(self.saveScript) self.consoleBox = gui.widgetBox(self, 'Console') self.splitCanvas.addWidget(self.consoleBox) # self.console = PySparkConsole(self.__dict__, self, sc = self.sc) self.console = EmbedIPython(sc=self.sc, hc=self.hc, sqlContext=self.sqlContext, data=self.data, df=self.df, df1=self.df1, df2=self.df2, df3=self.df3, transformer=self.transformer, estimator=self.estimator, model=self.model) # self.console.shell.run_cell('%pylab qt') self.console.shell.run_cell( 'print("{sparklogo}")'.format(sparklogo=self.spark_logo)) self.consoleBox.layout().addWidget(self.console) self.consoleBox.setAlignment(Qt.AlignBottom) select_row(self.libraryView, self.currentScriptIndex) self.splitCanvas.setSizes([2, 1]) # if self.splitterState is not None: # self.splitCanvas.restoreState(QByteArray(self.splitterState)) # # self.splitCanvas.splitterMoved[int, int].connect(self.onSpliterMoved) self.controlArea.layout().addStretch(1) self.resize(800, 600) def handleNewSignals(self): self.unconditional_commit() def selectedScriptIndex(self): rows = self.libraryView.selectionModel().selectedRows() if rows: return [i.row() for i in rows][0] else: return None def setSelectedScript(self, index): select_row(self.libraryView, index) def onAddScript(self, *args): self.libraryList.append(Script("New script", "", 0)) self.setSelectedScript(len(self.libraryList) - 1) def onAddScriptFromFile(self, *args): filename = QFileDialog.getOpenFileName( self, 'Open Python Script', os.path.expanduser("~/"), 'Python files (*.py)\nAll files(*.*)') filename = str(filename[0]) if filename: name = os.path.basename(filename) contents = open( filename, "rb", encoding="utf-8").read() #.decode("utf-8", errors = "ignore") self.libraryList.append(Script(name, contents, 0, filename)) self.setSelectedScript(len(self.libraryList) - 1) def onRemoveScript(self, *args): index = self.selectedScriptIndex() if index is not None: del self.libraryList[index] select_row(self.libraryView, max(index - 1, 0)) def onSaveScriptToFile(self, *args): index = self.selectedScriptIndex() if index is not None: self.saveScript() def onSelectedScriptChanged(self, selected, deselected): index = [i.row() for i in selected.indexes()] if index: current = index[0] if current >= len(self.libraryList): self.addNewScriptAction.trigger() return self.text.setDocument(self.documentForScript(current)) self.currentScriptIndex = current def documentForScript(self, script=0): if type(script) != Script: script = self.libraryList[script] if script not in self._cachedDocuments: doc = QtGui.QTextDocument(self) doc.setDocumentLayout(QtGui.QPlainTextDocumentLayout(doc)) doc.setPlainText(script.script) doc.setDefaultFont(QFont(self.defaultFont)) doc.highlighter = PythonSyntaxHighlighter(doc) doc.modificationChanged[bool].connect(self.onModificationChanged) doc.setModified(False) self._cachedDocuments[script] = doc return self._cachedDocuments[script] def commitChangesToLibrary(self, *args): index = self.selectedScriptIndex() if index is not None: self.libraryList[index].script = self.text.toPlainText() self.text.document().setModified(False) self.libraryList.emitDataChanged(index) def onModificationChanged(self, modified): index = self.selectedScriptIndex() if index is not None: self.libraryList[index].flags = Script.Modified if modified else 0 self.libraryList.emitDataChanged(index) def onSpliterMoved(self, pos, ind): self.splitterState = str(self.splitCanvas.saveState()) def updateSelecetdScriptState(self): index = self.selectedScriptIndex() if index is not None: script = self.libraryList[index] self.libraryList[index] = Script(script.name, self.text.toPlainText(), 0) def saveScript(self): index = self.selectedScriptIndex() if index is not None: script = self.libraryList[index] filename = script.filename else: filename = os.path.expanduser("~/") filename = QFileDialog.getSaveFileName( self, 'Save Python Script', filename, 'Python files (*.py)\nAll files(*.*)') if filename: fn = "" head, tail = filename #os.path.splitext(filename) if not tail: fn = head + ".py" else: fn = head f = open(fn, 'w', encoding='utf-8') f.write(self.text.toPlainText()) f.close() def commit(self): self._script = str(self.text.toPlainText()) inputs = [ 'data', 'df', 'df1', 'df2', 'df3', 'transformer', 'estimator', 'model' ] self.console.shell.user_ns.update( {input: getattr(self, input) for input in inputs}) self.console.execute(self._script) for input in inputs: getattr(self.Outputs, input).send(self.console.shell.user_ns[input])
def __init__(self, *args): # Invoke parent init QListView.__init__(self, *args) # Get a reference to the window object self.win = get_app().window # Get Model data self.files_model = FilesModel() self.setAcceptDrops(True) self.setDragEnabled(True) self.setDropIndicatorShown(True) self.selected = [] self.ignore_image_sequence_paths = [] # Setup header columns self.setModel(self.files_model.model) self.setIconSize(QSize(131, 108)) self.setViewMode(QListView.IconMode) self.setResizeMode(QListView.Adjust) self.setSelectionMode(QAbstractItemView.ExtendedSelection) self.setUniformItemSizes(True) self.setWordWrap(True) self.setStyleSheet('QListView::item { padding-top: 2px; }') # Refresh view self.refresh_view() # setup filter events app = get_app() app.window.filesFilter.textChanged.connect(self.filter_changed) app.window.actionFilesClear.triggered.connect(self.clear_filter)
def __init__(self, *args): # Invoke parent init QListView.__init__(self, *args) # Get a reference to the window object self.win = get_app().window # Get Model data self.effects_model = EffectsModel() # Keep track of mouse press start position to determine when to start drag self.setAcceptDrops(True) self.setDragEnabled(True) self.setDropIndicatorShown(True) # Setup header columns self.setModel(self.effects_model.model) self.setIconSize(QSize(131, 108)) self.setViewMode(QListView.IconMode) self.setResizeMode(QListView.Adjust) self.setUniformItemSizes(True) self.setWordWrap(True) self.setStyleSheet('QListView::item { padding-top: 2px; }') # Refresh view self.refresh_view() # setup filter events app = get_app() app.window.effectsFilter.textChanged.connect(self.filter_changed) app.window.actionEffectsClear.triggered.connect(self.clear_filter)
def __init__(self, commits, commit_url, *args): # Invoke parent init QListView.__init__(self, *args) # Get a reference to the window object self.win = get_app().window # Get Model data self.changelog_model = ChangelogModel(commits) self.selected = [] # Setup header columns self.setModel(self.changelog_model.model) self.setIndentation(0) self.setSelectionBehavior(QTreeView.SelectRows) self.setSelectionBehavior(QAbstractItemView.SelectRows) self.setSelectionMode(QAbstractItemView.ExtendedSelection) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.setWordWrap(True) self.setStyleSheet('QTreeView::item { padding-top: 2px; }') self.commit_url = commit_url # Refresh view self.refresh_view() # setup filter events app = get_app()
class AppletNoticeWindow(QWidget): def __init__(self, controller): super(AppletNoticeWindow, self).__init__() self.__controller = controller self.__pkglist = [] # setup widgets self.__vbox_up = QVBoxLayout() self.__critical_label = QLabel() self.__critical_label.setWordWrap(True) self.__list_model = QStringListModel() self.__list_view = QListView() self.__list_view.setModel(self.__list_model) self.__vbox_up.addWidget(self.__critical_label) self.__vbox_up.addWidget(self.__list_view) # bottom buttons self.__vbox = QVBoxLayout() self.__vbox.addLayout(self.__vbox_up) self.__button_hbox = QHBoxLayout() self.__close_button = QPushButton(_("Close")) self.__launch_pm_button = QPushButton(_("Launch Application Browser")) self.__button_hbox.addWidget(self.__launch_pm_button) self.__button_hbox.addWidget(self.__close_button) self.__vbox.addLayout(self.__button_hbox) self.setLayout(self.__vbox) # set window settings self.resize(400, 200) self.setWindowTitle(_("Application updates")) self.__close_button.clicked.connect(self.on_close) self.__launch_pm_button.clicked.connect(self.on_pm) def closeEvent(self, event): """ We don't want to kill the window, since the whole app will close otherwise. """ event.ignore() self.on_close() def on_pm(self): self.__controller.launch_package_manager() def on_close(self): self.__controller.trigger_notice_window() def populate(self, pkg_data, critical_txt): self.__list_model.setStringList(pkg_data) self.__critical_label.setText(critical_txt) self.__list_view.update()
def close(self): """Explicitly called destructor. Removes widget from the qpart """ self._closeIfNotUpdatedTimer.stop() self._qpart.removeEventFilter(self) self._qpart.cursorPositionChanged.disconnect(self._onCursorPositionChanged) QListView.close(self)