class MainWindow(QMainWindow): def __init__(self): super().__init__() self.view = QTableView() self.view.horizontalHeader().hide() self.view.verticalHeader().hide() self.view.setGridStyle(Qt.NoPen) delegate = PreviewDelegate() self.view.setItemDelegate(delegate) self.model = PreviewModel() self.view.setModel(self.model) self.setCentralWidget(self.view) # Add a bunch of images. image_files = glob.glob("*.jpg") for n, fn in enumerate(image_files): image = QImage(fn) item = preview(n, fn, image) self.model.previews.append(item) self.model.layoutChanged.emit() self.view.resizeRowsToContents() self.view.resizeColumnsToContents()
class CrosswordWidget(QWidget): def __init__(self, crossword_index, grid_data, grid_cell_length): QWidget.__init__(self) self.grid_model = CrosswordGridModel(crossword_index, grid_data) self.grid_delegate = CrosswordGridDelegate(grid_data) self.grid_table_view = QTableView(self) #sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) #self.grid_table_view.setSizePolicy(sizePolicy) self.grid_table_view.setModel(self.grid_model) self.grid_table_view.setItemDelegate(self.grid_delegate) self.grid_table_view.resizeColumnsToContents() self.grid_table_view.setStyleSheet("background:transparent") #self.grid_horizontal_header = self.grid_table_view.horizontalHeader() #self.grid_horizontal_header.setSectionResizeMode(QHeaderView.Fixed) #self.grid_horizontal_header.setDefaultSectionSize(grid_cell_length) #self.grid_horizontal_header.hide() #self.grid_vertical_header = self.grid_table_view.verticalHeader() #self.grid_vertical_header.setSectionResizeMode(QHeaderView.Fixed) #self.grid_vertical_header.setDefaultSectionSize(grid_cell_length * 1.3) #self.grid_vertical_header.hide() #self.main_layout = QHBoxLayout(self) #self.main_layout.addWidget(self.grid_table_view) #self.setLayout(self.main_layout) #self.layout().addWidget(self.grid_table_view) def save_solution(self): if self.grid_model.save_solution(): status_bar.showMessage("Solution saved")
class DebugBreakpointsWidget(QWidget, DockContextHandler): def __init__(self, parent, name, data): if not type(data) == binaryninja.binaryview.BinaryView: raise Exception('expected widget data to be a BinaryView') self.bv = data QWidget.__init__(self, parent) DockContextHandler.__init__(self, self, name) self.actionHandler = UIActionHandler() self.actionHandler.setupActionHandler(self) self.table = QTableView(self) self.model = DebugBreakpointsListModel(self.table, data) self.table.setModel(self.model) self.item_delegate = DebugBreakpointsItemDelegate(self) self.table.setItemDelegate(self.item_delegate) # self.table.setSortingEnabled(True) self.table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) self.table.setSelectionMode(QAbstractItemView.ExtendedSelection) self.table.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents) self.table.verticalHeader().setVisible(False) self.table.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) self.table.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self.table.resizeColumnsToContents() self.table.resizeRowsToContents() for i in range(len(self.model.columns)): self.table.setColumnWidth(i, self.item_delegate.sizeHint(self.table.viewOptions(), self.model.index(-1, i, QModelIndex())).width()) self.table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) layout.addWidget(self.table) self.setLayout(layout) def notifyOffsetChanged(self, offset): pass def notifyBreakpointsChanged(self, new_rows): self.model.update_rows(new_rows) def contextMenuEvent(self, event): self.m_contextMenuManager.show(self.m_menu, self.actionHandler) def shouldBeVisible(self, view_frame): if view_frame is None: return False else: return True
def __init__(self, data_list, header, *args): QWidget.__init__(self, *args) # setGeometry(x_pos, y_pos, width, height) self.setGeometry(300, 200, 570, 450) self.setWindowTitle('Click on column title to sort') # Setup the model and view '''tmodel = MyTableModel(self, data_list, header) tview = QTableView() tview.setModel(tmodel) delegate = MyDelegate() tview.setItemDelegate(delegate)''' # Setup the proxy model for sorting and filtering tmodel = MyTableModel(self, data_list, header) pmodel = QSortFilterProxyModel() pmodel.setSourceModel(tmodel) tview = QTableView() tview.setModel(pmodel) delegate = MyDelegate() tview.setItemDelegate(delegate) # TableView properties tview.resizeColumnsToContents() # set column width to fit contents tview.setShowGrid(False) # hide gridlines #tview.verticalHeader().hide() # row labels #tview.horizontalHeader().hide() # column labels # Select a single row at a time tview.setSelectionBehavior(QTableView.SelectRows) tview.setSelectionMode(QTableView.SingleSelection) # Enable sorting tview.setSortingEnabled(True) # Drag and drop reordering using header labels '''tview.verticalHeader().setSectionsMovable(True) tview.verticalHeader().setDragEnabled(True) tview.verticalHeader().setDragDropMode(QAbstractItemView.InternalMove) tview.horizontalHeader().setSectionsMovable(True) tview.horizontalHeader().setDragEnabled(True) tview.horizontalHeader().setDragDropMode(QAbstractItemView.InternalMove)''' # Drag and drop reordering using rows tview.setDragEnabled(True) tview.setAcceptDrops(True) tview.setDragDropMode(QTableView.InternalMove) tview.setDragDropOverwriteMode(False) layout = QVBoxLayout(self) layout.addWidget(tview) self.setLayout(layout)
def createDomainTable(self, domainmodel): domainTable = QTableView() domainTable.setModel(domainmodel) domainTable.setItemDelegate(DomainDelegate(domainTable)) domainTable.verticalHeader().setVisible(False) domainTable.resizeColumnsToContents() domainTable.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) domainTable.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch) return domainTable
class SQLite(QSqlDatabase): """ Класс для инициализации и открытия базы данных каталога, полученный из Slot'а (openFile) """ def __init__(self, path=None): """ Инициализация экземпляра класса :param path: путь до каталога, полученный изиз Slot'а (openFile) """ super().__init__() self.path = path self.width = 0 self.heigh = 0 self.db = QSqlDatabase.addDatabase('QSQLITE') self.db.setDatabaseName(self.path) self.db.open() self.window = QWidget() self.window.setWindowTitle("Каталог книг") self.conn = sqlite3.connect(self.path) cursor = self.conn.cursor() sql = f'select * from sqlite_master where type = "table"' # получение имени таблицы(первая в списке), к которой будет # осуществлено подключение cursor.execute(sql) self.search_result = cursor.fetchall()[0][1] self.model = QSqlTableModel(parent=self.window, db=self.db) self.model.setTable(self.search_result) self.db_record = QSqlRecord(self.db.record(self.search_result)) self.tableView = QTableView() def on(self): """ Метод для подключения и отображения подключенного каталога :return: виджет self.window """ self.model.setEditStrategy(QSqlTableModel.OnManualSubmit) self.model.select() self.model.setHeaderData(-1, Qt.Horizontal, self.db_record.fieldName(0)) vbox = QVBoxLayout() self.tableView.setModel(self.model) self.tableView.resizeColumnsToContents() self.tableView.resizeRowsToContents() for i in range(self.model.columnCount() + 2): self.width += self.tableView.columnWidth(i) for j in range(self.model.rowCount() + 1): self.heigh += self.tableView.rowHeight(j) self.tableView.resize(self.width + 50, self.heigh + 50) vbox.addWidget(self.tableView) self.window.setLayout(vbox) self.window.resize(self.tableView.width() + 30, self.tableView.height() + 120) return self.window
def test(): class XTest( XBase ): def __init__( self ): XBase.__init__( self ) self.name = "" self.vorname = "" self.alter = 0 self.haarfarbe = "" self.schuhgroesse = 0 self.bemerkung = "" x1 = XTest() x1.name = "Kendel" x1.vorname = "Martin" x1.alter = 66 x1.haarfarbe = "grau" x1.schuhgroesse = 44 x1.bemerkung = "Das ist alles \nein riesengroßer Irrtum" x2 = XTest() x2.name = "Haaretz" x2.vorname = "Yosh" x2.alter = 56 x2.haarfarbe = "schwarz" x2.schuhgroesse = 42 tm = DefaultIccTableModel( (x1, x2 ) ) tm.setSortable( True ) tm.setKeyHeaderMappings( { "Nachname": "name", "Vorname": "vorname", "Alter": "alter", "Bemerkung": "bemerkung" } ) tm.setNumColumnsIndexes( (2,) ) from PySide2.QtWidgets import QApplication app = QApplication() tv = QTableView( ) tv.setModel( tm ) tv.setAlternatingRowColors( True ) tv.setSortingEnabled( True ) tv.resizeColumnsToContents() tv.resizeRowsToContents() tm.layoutChanged.connect( tv.resizeRowsToContents ) ## <======== WICHTIG bei mehrzeiligem Text in einer Zelle! tv.show() app.exec_()
class DebugThreadsWidget(QWidget, DockContextHandler): def __init__(self, parent, name, data): if not type(data) == BinaryView: raise Exception('expected widget data to be a BinaryView') self.bv = data QWidget.__init__(self, parent) DockContextHandler.__init__(self, self, name) self.actionHandler = UIActionHandler() self.actionHandler.setupActionHandler(self) self.table = QTableView(self) self.model = DebugThreadsListModel(self.table) self.table.setModel(self.model) self.table.clicked.connect(self.threadRowClicked) self.item_delegate = DebugThreadsItemDelegate(self) self.table.setItemDelegate(self.item_delegate) # self.table.setSortingEnabled(True) self.table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) self.table.setSelectionMode(QAbstractItemView.ExtendedSelection) self.table.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents) self.table.verticalHeader().setVisible(False) self.table.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) self.table.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self.table.resizeColumnsToContents() self.table.resizeRowsToContents() for i in range(len(self.model.columns)): self.table.setColumnWidth(i, self.item_delegate.sizeHint(self.table.viewOptions(), self.model.index(-1, i, QModelIndex())).width()) self.table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) layout.addWidget(self.table) self.setLayout(layout) def notifyOffsetChanged(self, offset): pass # called from QTableView's clicked signal # index: QModelIndex def threadRowClicked(self, index): index = self.model.createIndex(index.row(), 0) tid_str = self.model.data(index, Qt.DisplayRole) #print('clicked to change to thread %s' % tid_str) stateObj = binjaplug.get_state(self.bv) if stateObj.connected and not stateObj.running: tid = int(tid_str, 16) stateObj.threads.current = tid stateObj.ui.context_display() stateObj.ui.on_step() else: print('cannot set thread in current state') # called from plugin's context_display() function def notifyThreadsChanged(self, new_threads): idx_selected = self.model.update_rows(new_threads) if idx_selected: self.table.setCurrentIndex(idx_selected) def contextMenuEvent(self, event): self.m_contextMenuManager.show(self.m_menu, self.actionHandler) def shouldBeVisible(self, view_frame): if view_frame is None: return False else: return True
class manageMembers(QMainWindow): def __init__(self, parent): super(manageMembers, self).__init__(parent) self.setWindowTitle("Tagok kezelése") widget = QWidget() main_layout = QHBoxLayout() widget.setLayout(main_layout) self.setCentralWidget(widget) # self.client = MysqlClient() self.table_view = QTableView() # self.model = TableModel(self.table_name, fejlec) self.model = QSqlTableModel(db=db) # a megjelenített tábla neve self.table_name = "members" main_layout.addWidget(self.table_view) fejlec = [ 'id', "Vezetéknév", "Utónév", "Született", "Ir.szám", "Helység", "Cím", "Telefon", "E-mail", "Tagság kezdete", 'Aktív' ] # self.model = TableModel(self.table_name) # print(self.model) self.table_view.setModel(self.model) self.table_view.setSortingEnabled(True) # Az első oszlop (id) elrejtése self.table_view.hideColumn(0) self.table_view.resizeColumnsToContents() gomb_layout = QVBoxLayout() main_layout.addLayout(gomb_layout) self.delete_button = QPushButton("&Tag törlése") self.add_button = QPushButton("&Új tag") self.modify_button = QPushButton("Tag &módosítása") gomb_layout.addWidget(self.delete_button) gomb_layout.addWidget(self.add_button) gomb_layout.addWidget(self.modify_button) self.space = QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding) gomb_layout.addItem(self.space) # self.resize(320, 200) self.setFixedSize(1000, 800) # self.showMaximized() # self.setWindowFlags(Qt.Window|Qt.WindowTitleHint) tb = self.addToolBar("File") exit = QAction(QIcon("images/door--arrow.png"), "Kilépés", self) tb.addAction(exit) excel = QAction(QIcon("images/excel.png"), "Excel", self) tb.addAction(excel) tb.actionTriggered[QAction].connect(self.toolbarpressed) # self.delete_button.clicked.connect(lambda: self.model.delete(self.table_view.selectedIndexes()[0])) self.delete_button.clicked.connect(self.tag_torles) self.add_button.clicked.connect(self.model.add) self.modify_button.clicked.connect(self.tag_modositas) def tag_torles(self): if len(self.table_view.selectedIndexes()) > 0: self.model.delete(self.table_view.selectedIndexes()[0]) else: reply = QMessageBox.question(None, 'Hiba!', 'Törlés előtt jelöljön ki egy sort!', QMessageBox.Ok) def tag_modositas(self): if len(self.table_view.selectedIndexes()) > 0: self.model.modify(self.table_view.selectedIndexes()[0]) else: reply = QMessageBox.question( None, 'Hiba!', 'Módosítás előtt jelöljön ki egy sort!', QMessageBox.Ok) def toolbarpressed(self, a): # print("Pressed:", a.text()) if a.text() == "Kilépés": self.close() if a.text() == "Excel": # print("Indulhat az excel exportálás") self.adatok = self.client.get_all(self.table_name) self._data = self.adatok[0] # print(self._data) p.save_as(array=self._data, dest_file_name="tagok.xlsx")
class StatsManager: GROUP_BY = ['filename', 'lineno', 'traceback'] # index in the combo box GROUP_BY_FILENAME = 0 GROUP_BY_LINENO = 1 GROUP_BY_TRACEBACK = 2 def __init__(self, window, app): self.app = app self.window = window self.snapshots = window.snapshots self.source = window.source self.filename_parts = 3 self._auto_refresh = False self.filters = [] self.history = History(self) self.model = StatsModel(self) self.view = QTableView(window) self.view.setModel(self.model) self.cumulative_checkbox = QCheckBox(window.tr("Cumulative sizes"), window) self.group_by = QtGui.QComboBox(window) self.group_by.addItems([ window.tr("Filename"), window.tr("Line number"), window.tr("Traceback"), ]) self.filters_label = QLabel(window) self.summary = QLabel(window) self.view.verticalHeader().hide() self.view.resizeColumnsToContents() self.view.setSortingEnabled(True) window.connect(self.group_by, QtCore.SIGNAL("currentIndexChanged(int)"), self.group_by_changed) window.connect(self.view, QtCore.SIGNAL("doubleClicked(const QModelIndex&)"), self.double_clicked) window.connect(self.cumulative_checkbox, QtCore.SIGNAL("stateChanged(int)"), self.change_cumulative) window.connect(self.snapshots.load_button, QtCore.SIGNAL("clicked(bool)"), self.load_snapshots) window.connect( self.view.selectionModel(), QtCore.SIGNAL( "selectionChanged(const QItemSelection&, const QItemSelection&)" ), self.selection_changed) self.clear() self._auto_refresh = True def clear(self): del self.filters[:] self.cumulative_checkbox.setCheckState(Qt.Unchecked) self.group_by.setCurrentIndex(self.GROUP_BY_FILENAME) self.history.clear() self.append_history() self.refresh() def load_snapshots(self, checked): self.source.clear() self.clear() def append_history(self): group_by = self.group_by.currentIndex() filters = self.filters[:] cumulative = self.cumulative_checkbox.checkState() state = HistoryState(group_by, filters, cumulative) self.history.append(state) def restore_state(self, state): self.filters = state.filters[:] self._auto_refresh = False self.cumulative_checkbox.setCheckState(state.cumulative) self.group_by.setCurrentIndex(state.group_by) self._auto_refresh = True self.refresh() def format_filename(self, filename): parts = filename.split(os.path.sep) if len(parts) > self.filename_parts: parts = [MORE_TEXT] + parts[-self.filename_parts:] return os.path.join(*parts) def get_group_by(self): index = self.group_by.currentIndex() return self.GROUP_BY[index] def get_cumulative(self): return (self.cumulative_checkbox.checkState() == Qt.Checked) def refresh(self): group_by = self.get_group_by() if group_by != 'traceback': cumulative = self.get_cumulative() else: # FIXME: add visual feedback cumulative = False snapshot1, snapshot2 = self.snapshots.load_snapshots(self.filters) self.view.clearSelection() group_by = self.get_group_by() self.model.set_stats(snapshot1, snapshot2, group_by, cumulative) self.view.resizeColumnsToContents() self.view.sortByColumn(self.model.get_default_sort_column(), Qt.DescendingOrder) if self.filters: filters = [] for filter in self.filters: text = self.format_filename(filter.filename_pattern) if filter.lineno: text = "%s:%s" % (text, filter.lineno) if filter.all_frames: text += self.window.tr(" (any frame)") if filter.inclusive: text = fmt(self.window.tr("include %s"), text) else: text = fmt(self.window.tr("exclude %s"), text) filters.append(text) filters_text = ", ".join(filters) else: filters_text = self.window.tr("(none)") filters_text = fmt(self.window.tr("Filters: %s"), filters_text) self.filters_label.setText(filters_text) total = self.model.total_text lines = len(self.model.stats) if group_by == 'filename': lines = fmt(self.window.tr("Files: %s"), lines) elif group_by == 'lineno': lines = fmt(self.window.tr("Lines: %s"), lines) else: lines = fmt(self.window.tr("Tracebacks: %s"), lines) total = fmt(self.window.tr("%s - Total: %s"), lines, total) self.summary.setText(total) def selection_changed(self, selected, unselected): indexes = selected.indexes() if not indexes: return stat = self.model.get_stat(indexes[0]) if stat is None: return self.source.set_traceback(stat.traceback, self.get_group_by() != 'filename') self.source.show_frame(stat.traceback[0]) def double_clicked(self, index): stat = self.model.get_stat(index) if stat is None: return group_by = self.get_group_by() if group_by == 'filename': all_frames = self.get_cumulative() self.filters.append( tracemalloc.Filter(True, stat.traceback[0].filename, all_frames=all_frames)) self._auto_refresh = False self.group_by.setCurrentIndex(self.GROUP_BY_LINENO) self.append_history() self._auto_refresh = True self.refresh() elif group_by == 'lineno': # Replace filter by filename with filter by line new_filter = tracemalloc.Filter(True, stat.traceback[0].filename, stat.traceback[0].lineno, all_frames=False) if self.filters: old_filter = self.filters[-1] replace = (old_filter.inclusive == new_filter.inclusive and old_filter.filename_pattern == new_filter.filename_pattern and old_filter.lineno == None) else: replace = False if replace: self.filters[-1] = new_filter else: self.filters.append(new_filter) self._auto_refresh = False self.group_by.setCurrentIndex(self.GROUP_BY_TRACEBACK) self.append_history() self._auto_refresh = True self.refresh() def group_by_changed(self, index): if not self._auto_refresh: return self.append_history() self.refresh() def change_cumulative(self, state): if not self._auto_refresh: return self.append_history() self.refresh()
class AutoFilterWidget(QWidget): """A widget to show the auto filter 'menu'.""" def __init__(self, parent): """Initialize class.""" super().__init__(parent) layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) self.model = MinimalTableModel(self) self.model.flags = self.model_flags self.view = QTableView(self) self.view.setModel(self.model) self.view.verticalHeader().hide() self.view.horizontalHeader().hide() self.view.setShowGrid(False) check_box_delegate = CheckBoxDelegate(self) self.view.setItemDelegateForColumn(0, check_box_delegate) check_box_delegate.data_committed.connect( self._handle_check_box_data_committed) self.button = QPushButton("Ok", self) self.button.setFlat(True) layout.addWidget(self.view) layout.addWidget(self.button) self.button.clicked.connect(self.hide) self.hide() self.setWindowFlags(Qt.FramelessWindowHint | Qt.Popup) def model_flags(self, index): """Return index flags.""" if not index.isValid(): return Qt.NoItemFlags if index.column() == 1: return ~Qt.ItemIsEditable return Qt.ItemIsEditable @Slot("QModelIndex", name="_handle_check_box_data_committed") def _handle_check_box_data_committed(self, index): """Called when checkbox delegate wants to edit data. Toggle the index's value.""" data = index.data(Qt.EditRole) model_data = self.model._main_data row_count = self.model.rowCount() if index.row() == 0: # Ok row value = data in (None, False) for row in range(row_count): model_data[row][0] = value self.model.dataChanged.emit(self.model.index(0, 0), self.model.index(row_count - 1, 0)) else: # Data row self.model.setData(index, not data) self.set_ok_index_data() def set_ok_index_data(self): """Set data for ok index based on data from all other indexes.""" ok_index = self.model.index(0, 0) true_count = 0 for row_data in self.model._main_data[1:]: if row_data[0] == True: true_count += 1 if true_count == len(self.model._main_data) - 1: self.model.setData(ok_index, True) elif true_count == 0: self.model.setData(ok_index, False) else: self.model.setData(ok_index, None) def set_values(self, values): """Set values to show in the 'menu'. Reset model using those values and update geometry.""" self.model.reset_model([[None, "All"]] + values) self.set_ok_index_data() self.view.horizontalHeader().hideSection( 2) # Column 2 holds internal data (cls_id_set) self.view.resizeColumnsToContents() width = self.view.horizontalHeader().length() + qApp.style( ).pixelMetric(QStyle.PM_ScrollBarExtent) self.setFixedWidth(width + 2) height = self.view.verticalHeader().length() + self.button.height() parent_height = self.parent().height() self.setFixedHeight(min(height, parent_height / 2) + 2) def set_section_height(self, height): """Set vertical header default section size as well as button height.""" self.view.verticalHeader().setDefaultSectionSize(height) self.button.setFixedHeight(height)
class DebugModulesWidget(QWidget, DockContextHandler): def __init__(self, parent, name, data): if not type(data) == binaryninja.binaryview.BinaryView: raise Exception('expected widget data to be a BinaryView') self.bv = data QWidget.__init__(self, parent) DockContextHandler.__init__(self, self, name) self.actionHandler = UIActionHandler() self.actionHandler.setupActionHandler(self) self.table = QTableView(self) self.model = DebugModulesListModel(self.table, data) self.table.setModel(self.model) self.item_delegate = DebugModulesItemDelegate(self) self.table.setItemDelegate(self.item_delegate) # self.table.setSortingEnabled(True) self.table.setSelectionBehavior( QAbstractItemView.SelectionBehavior.SelectRows) self.table.setSelectionMode(QAbstractItemView.ExtendedSelection) self.table.verticalHeader().setSectionResizeMode( QHeaderView.ResizeToContents) self.table.verticalHeader().setVisible(False) self.table.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) self.table.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self.table.resizeColumnsToContents() self.table.resizeRowsToContents() for i in range(len(self.model.columns)): self.table.setColumnWidth( i, self.item_delegate.sizeHint( self.table.viewOptions(), self.model.index(-1, i, QModelIndex())).width()) update_layout = QHBoxLayout() update_layout.setContentsMargins(0, 0, 0, 0) update_label = QLabel("Data is Stale") update_button = QPushButton("Refresh") update_button.clicked.connect(lambda: self.refresh()) update_layout.addWidget(update_label) update_layout.addStretch(1) update_layout.addWidget(update_button) self.update_box = QWidget() self.update_box.setLayout(update_layout) self.layout = QVBoxLayout() self.layout.setContentsMargins(0, 0, 0, 0) self.layout.setSpacing(0) self.layout.addWidget(self.table) self.setLayout(self.layout) def notifyOffsetChanged(self, offset): pass def refresh(self): debug_state = binjaplug.get_state(self.bv) debug_state.ui.update_modules() def notifyModulesChanged(self, new_modules): self.model.update_rows(new_modules) self.table.resizeColumnsToContents() self.layout.removeWidget(self.update_box) self.update_box.setVisible(False) def mark_dirty(self): self.layout.addWidget(self.update_box) self.update_box.setVisible(True) def contextMenuEvent(self, event): self.m_contextMenuManager.show(self.m_menu, self.actionHandler) def shouldBeVisible(self, view_frame): if view_frame is None: return False else: return True
class DLPSettingsGUI(QWidget): def __init__(self, dlp_controller=None, dlp_slicer=None, parent=None): QWidget.__init__(self, parent) self.parent = parent self.dlp_controller = dlp_controller self.dlp_slicer = dlp_slicer self.dlp_color_calibrator = DLPColorCalibrator() self.dlp_color_calibrator.analysis_completed_signal.connect(self.update_charts) self.__printer_parameters_list = {} self.__slicer_parameters_list = {} self.data_fit_chart_view = None self.data_fit_chart = None self.main_layout = QHBoxLayout() self.__init_table_widget__() self.__init_color_calibration_widget() self.__default_parameters_widget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.MinimumExpanding) self.main_layout.addWidget(self.__default_parameters_widget, stretch=1) self.main_layout.addWidget(self.__color_calibration_widget, stretch=2) self.setLayout(self.main_layout) self.main_layout.update() def __init_color_calibration_widget(self, parent=None): self.__color_calibration_widget = QGroupBox("Color Correction Options", parent) self.__color_calibration_widget.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding) color_calibration_layout = QVBoxLayout(self.__color_calibration_widget) chart_widget = QWidget(self.__color_calibration_widget) chart_layout = QGridLayout(chart_widget) self.data_fit_chart = QtCharts.QChart() self.data_fit_chart_view = QtCharts.QChartView(self.data_fit_chart) self.axis_x = QtCharts.QValueAxis() self.axis_x.setTitleText("Pixel Intensity") self.axis_x.setRange(0, 1) self.data_fit_chart.addAxis(self.axis_x, Qt.AlignBottom) self.axis_y = QtCharts.QValueAxis() self.axis_y.setTitleText("Voxel Height (\u03BCm)") self.axis_y.setRange(0, 10) self.data_fit_chart.addAxis(self.axis_y, Qt.AlignLeft) chart_layout.addWidget(self.data_fit_chart_view, 0, 0, 1, 4) chart_widget.setLayout(chart_layout) buttons_widget = QWidget(self.__color_calibration_widget) buttons_layout = QHBoxLayout(buttons_widget) analyze_data_button = QPushButton("Analyze Data") analyze_data_button.clicked.connect(self.analyze_images) self.parameters_estimation_label = QLabel(f'Estimated parameters: \u03B1 = {self.dlp_color_calibrator.optimized_parameters[0]:.3f}, \u03B2 = {self.dlp_color_calibrator.optimized_parameters[1]:.3f}, \u03B3 = {self.dlp_color_calibrator.optimized_parameters[2]:.3f}', buttons_widget) buttons_layout.addWidget(analyze_data_button) buttons_layout.addWidget(self.parameters_estimation_label) buttons_widget.setLayout(buttons_layout) color_calibration_layout.addWidget(chart_widget) color_calibration_layout.addWidget(buttons_widget) self.__color_calibration_widget.setLayout(color_calibration_layout) @Slot() def analyze_images(self): file_names = QFileDialog.getOpenFileNames(caption='Select data', dir='../measured_data/grayscale_measured_data', filter="Image Files (*.asc)") self.dlp_color_calibrator.analyze_data_files(file_names[0]) @Slot() def update_charts(self): self.data_fit_chart = QtCharts.QChart() self.data_fit_chart.setAnimationOptions(QtCharts.QChart.AllAnimations) self.add_series(self.data_fit_chart, "Measured Data", self.dlp_color_calibrator.input_values, self.dlp_color_calibrator.average_data) self.add_series(self.data_fit_chart, "Fitted Curve", self.dlp_color_calibrator.input_values, self.dlp_color_calibrator.fitted_curve) self.add_series(self.data_fit_chart, "Predicted Result", self.dlp_color_calibrator.input_values, self.dlp_color_calibrator.corrected_output_values) series = self.data_fit_chart.series() self.data_fit_chart.addAxis(self.axis_x, Qt.AlignBottom) self.axis_y.setRange(0, self.dlp_color_calibrator.measured_thickness) self.data_fit_chart.addAxis(self.axis_y, Qt.AlignLeft) for s in series: s.attachAxis(self.axis_x) s.attachAxis(self.axis_y) self.data_fit_chart_view.setRenderHint(QPainter.Antialiasing) self.data_fit_chart_view.setChart(self.data_fit_chart) self.parameters_estimation_label.setText(f'Estimated parameters: \u03B1 = {self.dlp_color_calibrator.optimized_parameters[0]:.3f}, \u03B2 = {self.dlp_color_calibrator.optimized_parameters[1]:.3f}, \u03B3 = {self.dlp_color_calibrator.optimized_parameters[2]:.3f}') def add_series(self, chart, title, x, y): series = QtCharts.QLineSeries() series.setName(title) for idx, elem in enumerate(x): series.append(x[idx], y[idx]) chart.addSeries(series) def __init_table_widget__(self, parent=None): self.__default_parameters_widget = QGroupBox("Default Parameters", parent) self.printer_parameters_list = self.dlp_controller.get_default_parameters() self.table_view = QTableView() self.table_model = self.MyTableModel(parent=self.__default_parameters_widget, data_list=self.printer_parameters_list) self.table_view.setModel(self.table_model) self.table_view.horizontalHeader().setVisible(False) self.table_view.verticalHeader().setVisible(False) self.table_view.horizontalHeader().setStretchLastSection(False) # self.table_view.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.table_view.resizeColumnsToContents() self.table_view.update() # self.table_view.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) # self.table_view.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) apply_button = QPushButton("Apply Changes", self.__default_parameters_widget) apply_button.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) apply_button.clicked.connect(self.dlp_controller.save_default_parameters) default_parameters_layout = QVBoxLayout(self.__default_parameters_widget) default_parameters_layout.addWidget(self.table_view) default_parameters_layout.addWidget(apply_button) self.__default_parameters_widget.setLayout(default_parameters_layout) self.__default_parameters_widget.updateGeometry() # default_parameters_layout.update() # QGuiApplication.processEvents() @Slot() def __adjust_table_size__(self): self.table_view.resizeColumnToContents(0) self.table_view.resizeColumnToContents(1) rect = self.table_view.geometry() rect.setWidth(1 + self.table_view.verticalHeader().width() + self.table_view.columnWidth(0) + self.table_view.columnWidth(1) + self.table_view.verticalScrollBar().width()) self.table_view.setGeometry(rect) self.table_view.resize(rect.width(), rect.height()) class MyTableModel(QAbstractTableModel): def __init__(self, parent, data_list, *args): QAbstractTableModel.__init__(self, parent, *args) self.parent = parent self.data_list = data_list def rowCount(self, parent): return len(self.data_list) def columnCount(self, parent): return 2 def data(self, index, role): if not index.isValid(): return None elif role != Qt.DisplayRole: return None return list(self.data_list.items())[index.row()][index.column()] def setData(self, index, value, role): if role == Qt.EditRole: if not index.isValid(): return False elif index.column() == 0: return False else: key = list(self.data_list.items())[index.row()][0] old_value = list(self.data_list.items())[index.row()][1] try: if isinstance(old_value, float): self.data_list[key] = float(value) elif isinstance(old_value, bool): if value == "True" or value == "true": self.data_list[key] = True else: self.data_list[key] = False elif isinstance(old_value, str): if index.row() == 0: if not (value.upper() == "TOP-DOWN" or value.upper() == "BOTTOM-UP"): return False self.data_list[key] = str(value).upper() except ValueError: return False self.dataChanged.emit(index, index) return True else: return False def flags(self, index): if not index.isValid() or index.column() == 0: return Qt.ItemIsEnabled return Qt.ItemFlags(QAbstractTableModel.flags(self, index) | Qt.ItemIsEditable)
class ManageSettings(QMainWindow): def __init__(self, parent): super(ManageSettings, self).__init__(parent) self.setWindowTitle("Paraméterek kezelése") widget = QWidget() main_layout = QHBoxLayout() widget.setLayout(main_layout) self.setCentralWidget(widget) self.table_view = QTableView() main_layout.addWidget(self.table_view) self.model = QSqlTableModel(db=db) self.model.setTable("settings") self.model.select() self.model.setEditStrategy(QSqlTableModel.OnManualSubmit) self.model.setHeaderData(1, Qt.Horizontal, "Paraméter") self.model.setHeaderData(2, Qt.Horizontal, "Érték") self.table_view.setModel(self.model) self.table_view.setSortingEnabled(True) self.table_view.hideColumn(0) self.table_view.resizeColumnsToContents() self.model.dataChanged.connect(self.valtozott) gomb_layout = QVBoxLayout() main_layout.addLayout(gomb_layout) self.apply_button = QPushButton("Módosítások alkalmazása") self.cancel_button = QPushButton("Módosítások elvetése") gomb_layout.addWidget(self.apply_button) gomb_layout.addWidget(self.cancel_button) self.space = QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding) gomb_layout.addItem(self.space) self.setFixedSize(400, 600) tb = self.addToolBar("File") exit = QAction(QIcon("images/door--arrow.png"), "Kilépés", self) tb.addAction(exit) tb.actionTriggered[QAction].connect(self.toolbarpressed) self.apply_button.clicked.connect(self.valtozas_mentese) self.cancel_button.clicked.connect(self.valtozas_elvetese) def toolbarpressed(self, a): if a.text() == "Kilépés": self.close() def valtozott(self): self.apply_button.setStyleSheet('background-color: green;') self.cancel_button.setStyleSheet('background-color: red;') def valtozas_mentese(self): self.model.submitAll() self.apply_button.setStyleSheet('') self.cancel_button.setStyleSheet('') def valtozas_elvetese(self): self.model.revertAll() self.apply_button.setStyleSheet('') self.cancel_button.setStyleSheet('')
class FieldNameListEditor(QWidget): """A widget to edit foreign keys' field name lists.""" data_committed = Signal(name="data_committed") def __init__(self, parent, option, index): """Initialize class.""" super().__init__(parent) layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) self.model = MinimalTableModel(self) self.model.flags = self.model_flags self.view = QTableView(self) self.view.setModel(self.model) self.view.verticalHeader().hide() self.view.horizontalHeader().hide() self.view.setShowGrid(False) check_box_delegate = CheckBoxDelegate(self) self.view.setItemDelegateForColumn(0, check_box_delegate) check_box_delegate.data_committed.connect( self._handle_check_box_data_committed) self.button = QPushButton("Ok", self) self.button.setFlat(True) self.view.verticalHeader().setDefaultSectionSize(option.rect.height()) self.button.setFixedHeight(option.rect.height()) layout.addWidget(self.view) layout.addWidget(self.button) self.button.clicked.connect(self._handle_ok_button_clicked) self.setWindowFlags(Qt.FramelessWindowHint | Qt.Popup) x_offset = parent.parent().columnViewportPosition(index.column()) y_offset = parent.parent().rowViewportPosition(index.row()) self.position = parent.mapToGlobal(QPoint(0, 0)) + QPoint( x_offset, y_offset) def model_flags(self, index): """Return index flags.""" if not index.isValid(): return Qt.NoItemFlags if index.column() != 0: return ~Qt.ItemIsEditable return Qt.ItemIsEditable @Slot("QModelIndex", name="_handle_check_box_data_committed") def _handle_check_box_data_committed(self, index): """Called when checkbox delegate wants to edit data. Toggle the index's value.""" data = index.data(Qt.EditRole) self.model.setData(index, not data) @Slot("bool", name="_handle_ok_button_clicked") def _handle_ok_button_clicked(self, checked=False): """Called when user pressed Ok.""" self.data_committed.emit() def set_data(self, field_names, current_field_names): """Set values to show in the 'menu'. Reset model using those values and update geometry.""" data = [[name in current_field_names, name] for name in field_names] self.model.reset_model(data) self.view.resizeColumnsToContents() width = self.view.horizontalHeader().length() + qApp.style( ).pixelMetric(QStyle.PM_ScrollBarExtent) self.setFixedWidth(width + 2) height = self.view.verticalHeader().length() + self.button.height() parent_height = self.parent().height() self.setFixedHeight(min(height, parent_height / 2) + 2) self.move(self.position) def data(self): return ",".join( [name for checked, name in self.model._main_data if checked])
class RssTab(QWidget): new_torrents = Signal(int) def __init__(self): QWidget.__init__(self) layout = QVBoxLayout(self) self.splitter = QSplitter(self) self.cats = QTreeView(self) self.cats.setSortingEnabled(True) self.cat_model = RssCategoryModel() proxy = QSortFilterProxyModel() proxy.setSourceModel(self.cat_model) self.cats.setModel(proxy) self.splitter.addWidget(self.cats) self.t = QTableWidget(0, 4, self) self.splitter.addWidget(self.t) self.stats = [QLabel('{}'.format(datetime.now())) for _ in range(8)] stat: QLabel for stat in self.stats: stat.setFont(QFont(pointSize=14)) layout.addWidget(stat, 0, Qt.AlignTop) layout.addWidget(self.splitter, 0, Qt.AlignTop) self.ds = DataSource() self.f_model = ForumsModel(self.ds.get_forums()) self.forums = QTableView(self) self.forums.setModel(self.f_model) self.forums.resizeColumnsToContents() layout.addWidget(self.forums, 10, Qt.AlignTop) self.setLayout(layout) self.worker = RssWorker() self.worker_thread = QThread() self.worker_thread.started.connect(self.worker.run) self.worker.finished.connect(self.worker_thread.quit) self.worker.moveToThread(self.worker_thread) self.worker_thread.start() self.worker.processed.connect(self.processed) self.worker.current.connect(self.current) @Slot(str) def current(self, topic): for i in range(len(self.stats) - 1): self.stats[i].setText(self.stats[i + 1].text()) self.stats[len(self.stats) - 1].setText('{0} - {1}'.format( datetime.now(), topic)) @Slot(int, int) def processed(self, forum_id, torrents): print('\t\t\tRSS: ' + str(forum_id) + ', ' + str(torrents)) forum = self.ds.get_forum(forum_id) print('\t\t\tRSS FORUM: ' + str(forum)) cat = self.ds.get_category(forum['category']) print('\t\t\tRSS CAT: ' + str(cat)) self.cat_model.addCategory(cat['title'], torrents) def finish(self): self.worker.finish() self.worker_thread.quit() self.worker_thread.wait()
class ManageMembers(QMainWindow): def __init__(self, parent): super(ManageMembers, self).__init__(parent) self.setWindowTitle("Tagok kezelése") widget = QWidget() main_layout = QHBoxLayout() widget.setLayout(main_layout) self.setCentralWidget(widget) self.table_view = QTableView() main_layout.addWidget(self.table_view) self.model = QSqlTableModel(db=db) self.model.setTable("members") self.model.select() self.model.setEditStrategy(QSqlTableModel.OnManualSubmit) self.model.setHeaderData(1, Qt.Horizontal, "Vezetéknév") self.model.setHeaderData(2, Qt.Horizontal, "Utónév") self.model.setHeaderData(3, Qt.Horizontal, "Született") self.model.setHeaderData(4, Qt.Horizontal, "Ir.szám") self.model.setHeaderData(5, Qt.Horizontal, "Helység") self.model.setHeaderData(6, Qt.Horizontal, "Cím") self.model.setHeaderData(7, Qt.Horizontal, "Telefon") self.model.setHeaderData(8, Qt.Horizontal, "E-mail") self.model.setHeaderData(9, Qt.Horizontal, "Tagság kezdete") self.model.setHeaderData(10, Qt.Horizontal, "Aktív") # self.model.setFilter('vezeteknev Like "Czi%"') self.table_view.setModel(self.model) self.table_view.hideColumn(0) self.table_view.resizeColumnsToContents() # Ha ez engedélyezve, akkor a model-nél beállított sort nem működik, ez felülírja # Enélkül működik a model-es beállítás self.table_view.setSortingEnabled(True) # Ha engedélyezve van a fejléc szerinti rendezés, akkor UTÁNA meg lehet adni az alap sorrendet self.table_view.sortByColumn(1, Qt.AscendingOrder) self.model.dataChanged.connect(self.valtozott) gomb_layout = QVBoxLayout() main_layout.addLayout(gomb_layout) self.delete_button = QPushButton("&Tag törlése") self.add_button = QPushButton("&Új tag") self.apply_button = QPushButton("Módosítások alkalmazása") self.cancel_button = QPushButton("Módosítások elvetése") gomb_layout.addWidget(self.delete_button) gomb_layout.addWidget(self.add_button) gomb_layout.addWidget(self.apply_button) gomb_layout.addWidget(self.cancel_button) self.space = QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding) gomb_layout.addItem(self.space) self.setFixedSize(1000, 800) tb = self.addToolBar("File") exit = QAction(QIcon("images/door--arrow.png"), "Kilépés", self) tb.addAction(exit) excel = QAction(QIcon("images/excel.png"), "Excel", self) tb.addAction(excel) tb.actionTriggered[QAction].connect(self.toolbarpressed) self.delete_button.clicked.connect(self.tag_torles) self.add_button.clicked.connect(self.tag_hozzadas) self.apply_button.clicked.connect(self.valtozas_mentese) self.cancel_button.clicked.connect(self.valtozas_elvetese) def tag_hozzadas(self): self.form_window = UjtagFormDialog() self.form_window.setWindowTitle("Új tag felvétele") if self.form_window.exec_(): record = self.model.record() record.remove(record.indexOf('id')) for i in range(len(self.form_window.mezo_ertekek)): record.setValue(i, self.form_window.mezo_ertekek[i].text()) # print(i, record.value(i)) if self.model.insertRecord(-1, record): self.model.submitAll() self.apply_button.setStyleSheet('') self.cancel_button.setStyleSheet('') else: db.rollback() def tag_torles(self): if len(self.table_view.selectedIndexes()) > 0: self.model.removeRow(self.table_view.selectedIndexes()[0].row()) self.model.submitAll() else: reply = QMessageBox.question(None, 'Hiba!', 'Törlés előtt jelöljön ki egy sort!', QMessageBox.Ok) def toolbarpressed(self, a): if a.text() == "Kilépés": self.close() if a.text() == "Excel": data = [] for i in range(self.model.rowCount()): sor = [] for j in range(self.model.columnCount()): if isinstance(self.model.record(i).value(j), QDate): sor.append( self.model.record(i).value(j).toString( "yyyy-MM-dd")) else: sor.append(self.model.record(i).value(j)) data.append(sor) p.save_as(array=data, dest_file_name="tagok.xlsx") def valtozott(self): self.apply_button.setStyleSheet('background-color: green;') self.cancel_button.setStyleSheet('background-color: red;') def valtozas_mentese(self): self.model.submitAll() self.apply_button.setStyleSheet('') self.cancel_button.setStyleSheet('') def valtozas_elvetese(self): self.model.revertAll() self.apply_button.setStyleSheet('') self.cancel_button.setStyleSheet('')