def __init__(self, *args): # Invoke parent init QTableView.__init__(self, *args) # Get a reference to the window object self.win = get_app().window # Get Model data self.clip_properties_model = PropertiesModel(self) # Keep track of mouse press start position to determine when to start drag self.selected = [] self.selected_item = None # Setup header columns self.setModel(self.clip_properties_model.model) self.setSelectionBehavior(QAbstractItemView.SelectRows) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.setWordWrap(True) # Get table header horizontal_header = self.horizontalHeader() horizontal_header.setSectionResizeMode(QHeaderView.Stretch) vertical_header = self.verticalHeader() vertical_header.setVisible(False) # Refresh view self.clip_properties_model.update_model() # Resize columns self.resizeColumnToContents(0) self.resizeColumnToContents(1) # Connect filter signals get_app().window.txtPropertyFilter.textChanged.connect(self.filter_changed)
def __init__(self): super().__init__() self.setWindowTitle('Phone Book.') self.name = QLineEdit() self.number = QLineEdit() entry = QFormLayout() entry.addRow(QLabel('Name'), self.name) entry.addRow(QLabel('Number'), self.number) buttons = QHBoxLayout() button = QPushButton('&Add') button.clicked.connect(self._addEntry) buttons.addWidget(button) button = QPushButton('&Update') button.clicked.connect(self._updateEntry) buttons.addWidget(button) button = QPushButton('&Delete') button.clicked.connect(self._deleteEntry) buttons.addWidget(button) dataDisplay = QTableView() dataDisplay.setModel(PhoneDataModel()) layout = QVBoxLayout() layout.addLayout(entry) layout.addLayout(buttons) layout.addWidget(dataDisplay) self.setLayout(layout) self.show()
class UdpLogReceiver(QWidget): """ Log events generated by python logging objects. """ def __init__(self, parent=None): super().__init__(parent) self._model = LogRecordModel() filter_model = QSortFilterProxyModel() filter_model.setSourceModel(self._model) filter_model.setFilterKeyColumn(3) self.msg_filter = QLineEdit() self.log_view = QTableView() self.log_view.setModel(filter_model) header = self.log_view.horizontalHeader() #header.setSectionResizeMode(header.Stretch) header.setStretchLastSection(True) self.status_label = QLabel() # Connect signals: self.msg_filter.textChanged.connect(filter_model.setFilterFixedString) # Make nice layout: layout = QVBoxLayout(self) layout.addWidget(self.msg_filter) layout.addWidget(self.log_view) layout.addWidget(self.status_label) # Attach udp server: self._udpServer = UdpHandler(self._model) self._model.stats_changed.connect(self.status_label.setText)
def __init__(self, parent): super(Table, self).__init__() self.parent = parent tablemodel = TableModel(self.parent.dictpar[self.parent.code]['vphi'], self) tableview = QTableView() tableview.setModel(tablemodel)
def __init__(self, tableName, parent=None): super(TableEditor, self).__init__(parent) self.model = QSqlTableModel(self) self.model.setTable(tableName) self.model.setEditStrategy(QSqlTableModel.OnManualSubmit) self.model.select() self.model.setHeaderData(0, Qt.Horizontal, "ID") self.model.setHeaderData(1, Qt.Horizontal, "First name") self.model.setHeaderData(2, Qt.Horizontal, "Last name") view = QTableView() view.setModel(self.model) submitButton = QPushButton("Submit") submitButton.setDefault(True) revertButton = QPushButton("&Revert") quitButton = QPushButton("Quit") buttonBox = QDialogButtonBox(Qt.Vertical) buttonBox.addButton(submitButton, QDialogButtonBox.ActionRole) buttonBox.addButton(revertButton, QDialogButtonBox.ActionRole) buttonBox.addButton(quitButton, QDialogButtonBox.RejectRole) submitButton.clicked.connect(self.submit) revertButton.clicked.connect(self.model.revertAll) quitButton.clicked.connect(self.close) mainLayout = QHBoxLayout() mainLayout.addWidget(view) mainLayout.addWidget(buttonBox) self.setLayout(mainLayout) self.setWindowTitle("Cached Table")
class TestWidget(QWidget): def __init__(self): QWidget.__init__(self) vbox = QVBoxLayout(self) self.view = QTableView() self.model = Model(self.view) self.view.setModel(self.model) vbox.addWidget(self.view)
def __init__(self, parent): super().__init__(parent) self.logger = logging.getLogger(__name__) self.config = Configuration() self.filenames = [] self.data = "" # left part of frame header_left = [_("Relative Path"), _("Name"), _("Size"), _("Date Modified")] self.file_model = FileTableModel(self, header_left, []) self.file_view = QTableView() self.file_view.setModel(self.file_model) self.file_view.setSortingEnabled(True) self.file_view.setAlternatingRowColors(True) self.file_view.setShowGrid(False) # adjustments self.file_view.verticalHeader().setDefaultSectionSize(22) # self.file_view.horizontalHeader().setDefaultSectionSize(self.file_view.width()/len(header)) # self.file_view.horizontalHeader().setStretchLastSection(True) self.file_view.setSelectionMode(QAbstractItemView.SingleSelection) self.file_view.setSelectionBehavior(QAbstractItemView.SelectRows) self.file_view.doubleClicked.connect(self.file_view_doubleclicked) # self.file_view.clicked.connect(self.file_view_clicked) self.file_view.selectionModel().selectionChanged.connect(self.file_view_selection_changed) # self.file_view.setContextMenuPolicy(Qt.CustomContextMenu) # self.file_view.customContextMenuRequested.connect(self.file_view_context_menu_requested) # self.lb_nsfc = QLabel("") self.lb_path = QLabel("") self.lb_path.setFont(QFont("SansSerif", 10)) self.pb_select = QPushButton(_("Select")) self.pb_select.clicked.connect(self.show_explorer) # right part of frame header_right = [_("Set Name"), _("Files"), _("New Files"), _("Update Files"), _("Unchanged Files")] self.overview_model = OverviewTableModel(self, header_right, []) self.overview = QTableView() self.overview.setModel(self.overview_model) self.overview.setAlternatingRowColors(True) self.overview.setShowGrid(False) self.overview.verticalHeader().setDefaultSectionSize(22) self.pb_publish = QPushButton(_("Publish")) self.pb_publish.clicked.connect(self.pb_publish_clicked) self.pb_zip = QPushButton(_("Create Zip")) self.pb_zip.clicked.connect(self.pb_zip_clicked) self.__init_ui__()
def setModel(self, model): QTableView.setModel(self, model) # The model needs to be set to set header stuff hheader = self.horizontalHeader() hheader.setHighlightSections(False) hheader.setStretchLastSection(False) hheader.resizeSection(0, 100) hheader.setSectionResizeMode(0, QHeaderView.Fixed) hheader.setSectionResizeMode(1, QHeaderView.Stretch) hheader.setSectionResizeMode(2, QHeaderView.Stretch) vheader = self.verticalHeader() vheader.setVisible(False) vheader.setDefaultSectionSize(18)
def __init__(self, model, parent=None): QTableView.__init__(self, parent) # Custom delegates. self._checkBoxDelegate = CheckBoxDelegateQt() self._floatEditDelegate = FloatEditDelegateQt() self._dateTimeEditDelegates = [] # Each of these can have different formats. self._comboBoxDelegates = [] # Each of these can have different choices. self._pushButtonDelegates = [] # Each of these can have different text. self._fileDialogDelegate = FileDialogDelegateQt() # Set the model. self.setModel(model)
def draw_table(): tv = QTableView() tv.setMinimumSize(400, 400) tv.setShowGrid(False) vh = tv.verticalHeader() vh.setVisible(False) hh = tv.horizontalHeader() hh.setStretchLastSection(True) tv.setSortingEnabled(True) return tv
def setModel(self, model): QTableView.setModel(self._table, model) self._table.setSelectionModel(model._selectionModel) if model.rowCount() > 0: self.setCurrentIndex(self.PAGE_LISTVIEW) else: self.setCurrentIndex(self.PAGE_EMPTY) model.rowsInserted.connect(self._onRowsChanged) model.rowsRemoved.connect(self._onRowsChanged) self.model=model self._setListViewLook()
def __init__(self, *args): # Invoke parent init QTableView.__init__(self, *args) # Get a reference to the window object self.win = get_app().window # Get Model data self.clip_properties_model = PropertiesModel(self) self.transition_model = TransitionsModel(self) self.files_model = FilesModel(self) # Keep track of mouse press start position to determine when to start drag self.selected = [] self.selected_label = None self.selected_item = None self.new_value = None self.original_data = None # Setup header columns self.setModel(self.clip_properties_model.model) self.setSelectionBehavior(QAbstractItemView.SelectRows) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.setWordWrap(True) # Set delegate delegate = PropertyDelegate() self.setItemDelegateForColumn(1, delegate) self.previous_x = -1 # Get table header horizontal_header = self.horizontalHeader() horizontal_header.setSectionResizeMode(QHeaderView.Stretch) vertical_header = self.verticalHeader() vertical_header.setVisible(False) # Refresh view self.clip_properties_model.update_model() self.transition_model.update_model() self.files_model.update_model() # Resize columns self.resizeColumnToContents(0) self.resizeColumnToContents(1) # Connect filter signals get_app().window.txtPropertyFilter.textChanged.connect(self.filter_changed) get_app().window.InsertKeyframe.connect(self.Insert_Action_Triggered) self.doubleClicked.connect(self.doubleClickedCB) self.loadProperties.connect(self.select_item)
class MyWin(QWidget): def __init__(self, mydb): super(MyWin, self).__init__() main_lt = QVBoxLayout() self.view = QTableView() main_lt.addWidget(self.view) self.view.setWindowTitle("Table Model (View 1)") self.view.setSelectionBehavior(QAbstractItemView.SelectRows) self.mydb = mydb button = QPushButton("Join") button.clicked.connect(self.merge) main_lt.addWidget(button) button = QPushButton("Exit") button.clicked.connect(lambda: exit()) main_lt.addWidget(button) self.setLayout(main_lt) self.setWindowTitle('QT1') def set_model(self): self.view.setModel(self.mydb.get_model()) def merge(self): ind_list = self.view.selectedIndexes() out = list(self.view.model().data(i) for i in ind_list) out = [out[i] for i in range(len(out)) if i % 2 == 0] if len(out) < 2: return self.mydb.merge(out) mb = QMessageBox() mb.setText('Merged %s' % str(out)) mb.exec_() self.set_model()
def keyPressEvent(self, event): self.firstrelease = True event_check = int(event.key()) # event = event.key self.keylist.append(event_check) # print(self.keylist) Key_Control = 16777249 Shift_Control = 16777248 if event.key() == (Qt.Key_F1): # It should show if there action not activated self.parent.showHelpMenu() return if Key_Control not in self.keylist: # or Qt.Key_Shift not in self.keylist: # print('Choice 1') QTableView.keyPressEvent(self, event) return
def _setupUi(self): self.setWindowTitle(tr("Problems!")) self.resize(413, 323) self.verticalLayout = QVBoxLayout(self) self.label = QLabel(self) msg = tr("There were problems processing some (or all) of the files. The cause of " "these problems are described in the table below. Those files were not " "removed from your results.") self.label.setText(msg) self.label.setWordWrap(True) self.verticalLayout.addWidget(self.label) self.tableView = QTableView(self) self.tableView.setEditTriggers(QAbstractItemView.NoEditTriggers) self.tableView.setSelectionMode(QAbstractItemView.SingleSelection) self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows) self.tableView.setShowGrid(False) self.tableView.horizontalHeader().setStretchLastSection(True) self.tableView.verticalHeader().setDefaultSectionSize(18) self.tableView.verticalHeader().setHighlightSections(False) self.verticalLayout.addWidget(self.tableView) self.horizontalLayout = QHBoxLayout() self.revealButton = QPushButton(self) self.revealButton.setText(tr("Reveal Selected")) self.horizontalLayout.addWidget(self.revealButton) spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.closeButton = QPushButton(self) self.closeButton.setText(tr("Close")) self.closeButton.setDefault(True) self.horizontalLayout.addWidget(self.closeButton) self.verticalLayout.addLayout(self.horizontalLayout)
def __initWidgets(self): minimalSizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) # List of subtitles subListDelegate = SubListItemDelegate() self._model = QStandardItemModel(0, 3, self) self._model.setHorizontalHeaderLabels([_("Begin"), _("End"), _("Subtitle")]) self._subList = QTableView(self) self._subList.setModel(self._model) self._subList.setItemDelegateForColumn(0, subListDelegate) self._subList.setItemDelegateForColumn(1, subListDelegate) self._subList.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch) self._searchBar = SearchBar(self) self._searchBar.hide() # Top toolbar toolbar = QHBoxLayout() toolbar.setAlignment(Qt.AlignLeft) #toolbar.addWidget(someWidget....) toolbar.addStretch(1) # Main layout grid = QGridLayout() grid.setSpacing(10) grid.setContentsMargins(0, 3, 0, 0) grid.addLayout(toolbar, 0, 0, 1, 1) # stretch to the right grid.addWidget(self._subList, 1, 0) grid.addWidget(self._searchBar, 2, 0) self.setLayout(grid)
def _uic(self): mainLayout = QVBoxLayout() self.setLayout(mainLayout) topLayout = QHBoxLayout() topLayout.setContentsMargins(0,0,0,0) mainLayout.addLayout(topLayout,0) # Lay out the refresh button and filter popup self.refresh = QPushButton( _TR('Button to reload all data in char panel', 'Refresh') ) topLayout.addWidget(self.refresh,0) topLayout.addStretch(1) # push filters to the right self.popup = QComboBox() # Set choices in popup, must match to the lambdas # defined in CharFilter.set_filter() self.popup.addItem( _TR('char panel: show all characters', 'All') ) self.popup.addItem( _TR('char panel: show non-ascii characters', 'not 7-bit') ) self.popup.addItem( _TR('char panel: show non-latin-1', 'not Latin-1') ) topLayout.addWidget(self.popup,0) # Set up the table view, the actual visible table self.view = QTableView() self.view.setCornerButtonEnabled(False) self.view.setWordWrap(False) self.view.setAlternatingRowColors(True) mainLayout.addWidget(self.view,1) # give it all the stretch
def show_table(self, model): self.table = QTableView() self.table.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) self.model = model self.table.setWindowTitle("Books") self.table.setWindowIcon(QIcon(QPixmap('../images/icon.png'))) self.table.setModel(model) self.table.show()
def createView(title, model): view = QTableView() view.setModel(model) view.setItemDelegate(QSqlRelationalDelegate(view)) view.setWindowTitle(title) return view
def show_clients_model(self, clients, is_maid=False): self.table = QTableView() self.table.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) self.model = ClientsModel(is_maid) self.model.set_clients(clients) self.table.setModel(self.model) self.table.setWindowTitle('Show Client') self.table.setWindowIcon(QIcon(QPixmap(':/images/hotel_icon.jpg'))) self.table.show()
class viewTable(QDialog): def __init__(self, parent=None): fileName = filedialog.askopenfilename() if fileName != '': k = fileName.rfind("/") self.parent = parent self.parent.statusbar.showMessage("Opening dataset...") QWidget.__init__(self,parent) self.setWindowFlags(Qt.Window) self.setObjectName("dialog1") self.setGeometry(100,100,400,400) self.setWindowTitle(fileName[k+1:]) self.setWindowIcon(QIcon('NSlogo.png')) self.model = QStandardItemModel(self) with open(fileName, "r") as fileInput: for row in csv.reader(fileInput, delimiter='\t'): items = [ QStandardItem(field) for field in row ] self.model.appendRow(items) self.tableView = QTableView(self) self.tableView.setModel(self.model) self.layoutVertical = QVBoxLayout(self) self.layoutVertical.addWidget(self.tableView) self.parent = parent self.showMaximized() self.show() self.parent.ui.logOutput.append("VIEWED:") print("VIEWED:") self.parent.ui.logOutput.append(" " + str(fileName.split('/')[-1])) print(" " + str(fileName.split('/')[-1])) def closeEvent(self, event): self.model.clear() self.parent.ui.logOutput.append("") self.parent.statusbar.showMessage("Welcome back!")
def __init__(self, settings, directory, check_id_fct, annotations_path, parent=None): super().__init__(parent) # FIXME Delayed refactoring of check_id_fct and annotations_path. # Variables section. library_id = settings["libraryID"] library_type = settings["libraryType"] api_key = settings["apiKey"] self._zotero = ZoteroWrap(library_id, library_type, api_key, directory) # Widgets section. model = ZoteroTableModel(self._zotero, check_id_fct, annotations_path) model.load() proxy_model = QSortFilterProxyModel() proxy_model.setSourceModel(model) proxy_model.setDynamicSortFilter(True) proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive) proxy_model.setFilterKeyColumn(-1) # NB: All columns. self.view = QTableView(self) self.view.setModel(proxy_model) self.view.setCornerButtonEnabled(False) self.view.setEditTriggers(QAbstractItemView.NoEditTriggers) self.view.setSelectionBehavior(QAbstractItemView.SelectRows) self.view.setSelectionMode(QAbstractItemView.SingleSelection) # NB: Triggers a call to sortByColumn() which sorts by the first column. self.view.setSortingEnabled(True) self.view.setWordWrap(False) self.view.verticalHeader().hide() self.filter_edit = FilterEdit(self.view) # NB: The thread does not begin executing until start() is called. self.refresh_thread = ZoteroRefreshThread(model, self) # Layouts section. header_layout = QFormLayout() header_layout.addRow("Filter:", self.filter_edit) header_layout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) utils.configure_form_layout(header_layout) main_layout = QVBoxLayout() main_layout.addLayout(header_layout) main_layout.addWidget(self.view) self.setLayout(main_layout) # Signals section. self.filter_edit.textChanged.connect(proxy_model.setFilterFixedString) self.refresh_thread.started.connect(self.refresh_started) self.refresh_thread.finished.connect(self.refresh_finished)
def fill_UI(self): """sets up the layout """ self.table = QTableView() header = self.table.horizontalHeader() header.hide() header.setStretchLastSection(True) self.table.resizeColumnsToContents() self.table.setAlternatingRowColors(True) self.grid.addWidget(self.table, 1, 0) self.log.debug("\t=> Table created!")
def __init__(self, model): super(FreezeTableWidget, self).__init__() self.setModel(model) self.frozenTableView = QTableView(self) self.init() self.horizontalHeader().sectionResized.connect(self.updateSectionWidth) self.verticalHeader().sectionResized.connect(self.updateSectionHeight) self.frozenTableView.verticalScrollBar().valueChanged.connect( self.verticalScrollBar().setValue) self.verticalScrollBar().valueChanged.connect( self.frozenTableView.verticalScrollBar().setValue)
def initUI(self): #statusReplaceModel statusReplaceModel=QStandardItemModel() statusReplaceModel.setColumnCount(3) statusReplaceModel.setHorizontalHeaderLabels(["Файл","Найти","Заменить","Объект","Статус замены"]) #/statusReplaceModel StatusTable=QTableView(self) StatusTable.setModel(statusReplaceModel) StatusTable.setToolTip("Отчетная таблица") #mainLayout mainLayout = QVBoxLayout() mainLayout.setContentsMargins(0,0,0,0) mainLayout.addWidget(StatusTable) self.setLayout(mainLayout) #/mainLayout #self self.statusTable = StatusTable #/self StatusTable.doubleClicked.connect(self.openFile)
class WishlistForm(QDialog): def __init__(self): super(WishlistForm, self).__init__() self.initUI(self) def initUI(self, WishlistForm): layout = QGridLayout(self) self.show_wishlist_button = QPushButton("Show Wishlist") layout.addWidget(self.show_wishlist_button, 0, 1, 1, 2) self.setLayout(layout) self.show_wishlist_button.clicked.connect(self. show_wishlist_button_click) self.layout().setSizeConstraint(QLayout.SetFixedSize) self.setWindowTitle("Wishlist") self.setWindowIcon(QIcon(QPixmap('../images/whish.png'))) def show_table(self, model): self.table = QTableView() self.table.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) self.model = model self.table.setWindowTitle("Wishlist") self.table.setWindowIcon(QIcon(QPixmap('../images/icon.png'))) self.table.setModel(model) self.table.show() def show_wishlist_button_click(self): text = 'Want Тo Read' books = select_by_status(text) if books == []: QMessageBox(QMessageBox.Information, "No results", "There are no books in the wishlist!").exec_() return else: wishlist_model = BookModel() books = [Book(*book) for book in books] wishlist_model.set_books(books) self.show_table(wishlist_model)
class InstanceVM(object): def __init__(self, model, parent, file_path): self.file_path = os.path.abspath(file_path) self.modified = False self.model = model self.table_vm = InstanceTableModel(model) self.table_vm.modified.connect(self.set_dirty) self.table_view = QTableView() self.table_view.show() self.table_view.closeEvent = self.close_handler self.table_view.setModel(self.table_vm) self.parent = parent self.sub_window = parent.mdi.addSubWindow(self.table_view) self.sub_window.instance = self self.sub_window.setAttribute(Qt.WA_DeleteOnClose) self.update_title() parent.instances.append(self) def set_dirty(self): self.set_modified(True) def set_modified(self, b): self.modified = b self.sub_window.setWindowModified(b) def update_title(self): self.sub_window.setWindowTitle(self.file_path + "[*]") def close_handler(self, ev): if self.modified: ret = QMessageBox().question( self.table_view, "Confirm", "close without saving?", QMessageBox.Yes | QMessageBox.No) if ret == QMessageBox.No: ev.ignore() return self.parent.remove_instance(self)
class Gui: def __init__(self): # Init GuiBehavior() self.actions = GuiBehavior(self) self.app_name = '1Fichier Downloader v0.1.4' # Create App app = QApplication(sys.argv) app.setWindowIcon(QIcon(absp('ico.ico'))) app.setStyle('Fusion') app.aboutToQuit.connect(self.actions.handle_exit) self.app = app # Create Windows self.main_win() self.add_links_win() self.settings_win() # Change App Theme to saved one (Palette) if self.actions.settings: if len( self.actions.settings ) > 1: # conditional in case the user is using an old settings file self.actions.change_theme(self.actions.settings[1]) sys.exit(app.exec_()) def main_win(self): # Define Main Window self.main = QMainWindow() self.main.setWindowTitle(self.app_name) widget = QWidget(self.main) self.main.setCentralWidget(widget) # Create Grid grid = QGridLayout() # Top Buttons download_btn = QPushButton(QIcon(absp('res/download.svg')), ' Add Link(s)') download_btn.clicked.connect(lambda: self.add_links.show()) settings_btn = QPushButton(QIcon(absp('res/settings.svg')), ' Settings') settings_btn.clicked.connect(lambda: self.settings.show()) # Table self.table = QTableView() headers = [ 'Name', 'Size', 'Status', 'Down Speed', 'Progress', 'Password' ] self.table.setSizeAdjustPolicy( QAbstractScrollArea.AdjustToContentsOnFirstShow) self.table.horizontalHeader().setStretchLastSection(True) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setSortingEnabled(True) self.table.verticalHeader().hide() self.table_model = QStandardItemModel() self.table_model.setHorizontalHeaderLabels(headers) self.table.setModel(self.table_model) # Append widgets to grid grid.addWidget(download_btn, 0, 0) grid.addWidget(settings_btn, 0, 1) grid.addWidget(self.table, 1, 0, 1, 2) # Bottom Buttons resume_btn = QPushButton(QIcon(absp('res/resume.svg')), ' Resume') resume_btn.clicked.connect(self.actions.resume_download) pause_btn = QPushButton(QIcon(absp('res/pause.svg')), ' Pause') pause_btn.clicked.connect(self.actions.pause_download) stop_btn = QPushButton(QIcon(absp('res/stop.svg')), ' Remove') stop_btn.clicked.connect(self.actions.stop_download) # Add buttons to Horizontal Layout hbox = QHBoxLayout() hbox.addWidget(resume_btn) hbox.addWidget(pause_btn) hbox.addWidget(stop_btn) self.main.setWindowFlags(self.main.windowFlags() & Qt.CustomizeWindowHint) grid.addLayout(hbox, 2, 0, 1, 2) widget.setLayout(grid) self.main.resize(670, 415) self.main.show() def add_links_win(self): # Define Add Links Win self.add_links = QMainWindow(self.main) self.add_links.setWindowTitle('Add Link(s)') widget = QWidget(self.add_links) self.add_links.setCentralWidget(widget) # Create Vertical Layout layout = QVBoxLayout() # Text Edit self.links = QPlainTextEdit() layout.addWidget(self.links) # Button add_btn = QPushButton('Add Link(s)') add_btn.clicked.connect(self.actions.add_links) layout.addWidget(add_btn) self.add_links.setMinimumSize(300, 200) widget.setLayout(layout) def settings_win(self): # Define Settings Win self.settings = QMainWindow(self.main) self.settings.setWindowTitle('Settings') # Create StackedWidget and Selection List self.stacked_settings = QStackedWidget() self.settings_list = QListWidget() self.settings_list.setFixedWidth(110) self.settings_list.addItems(['Main', 'About']) self.settings_list.clicked.connect(self.actions.select_settings) # Central Widget central_widget = QWidget() hbox = QHBoxLayout() hbox.addWidget(self.settings_list) hbox.addWidget(self.stacked_settings) central_widget.setLayout(hbox) self.settings.setCentralWidget(central_widget) ''' Child widget Behavior Settings ''' behavior_settings = QWidget() self.stacked_settings.addWidget(behavior_settings) # Main Layouts vbox = QVBoxLayout() vbox.setAlignment(Qt.AlignTop) form_layout = QFormLayout() # Change Directory dl_directory_label = QLabel('Download directory:') form_layout.addRow(dl_directory_label) dl_directory_btn = QPushButton('Select..') dl_directory_btn.clicked.connect(self.actions.set_dl_directory) self.dl_directory_input = QLineEdit() if self.actions.settings is not None: self.dl_directory_input.setText(self.actions.settings[0]) self.dl_directory_input.setDisabled(True) form_layout.addRow(dl_directory_btn, self.dl_directory_input) # Bottom Buttons save_settings = QPushButton('Save') save_settings.clicked.connect(self.actions.save_settings) # Change theme theme_label = QLabel('Theme:') form_layout.addRow(theme_label) self.theme_select = QComboBox() self.theme_select.addItems(['Light', 'Dark']) self.theme_select.currentIndexChanged.connect( self.actions.change_theme) form_layout.addRow(self.theme_select) vbox.addLayout(form_layout) vbox.addStretch() vbox.addWidget(save_settings) behavior_settings.setLayout(vbox) ''' Child widget About ''' about_settings = QWidget() self.stacked_settings.addWidget(about_settings) about_layout = QGridLayout() about_layout.setAlignment(Qt.AlignCenter) logo = QLabel() logo.setPixmap(QPixmap(absp('res/zap.svg'))) logo.setAlignment(Qt.AlignCenter) text = QLabel(self.app_name) text.setStyleSheet('font-weight: bold; color: #4256AD') github_btn = QPushButton(QIcon(absp('res/github.svg')), '') github_btn.setFixedWidth(32) github_btn.clicked.connect( lambda: webbrowser.open('https://github.com/manuGMG/1fichier-dl')) about_layout.addWidget(logo, 0, 0, 1, 0) about_layout.addWidget(github_btn, 1, 0) about_layout.addWidget(text, 1, 1) about_settings.setLayout(about_layout)
def main_win(self): # Define Main Window self.main = QMainWindow() self.main.setWindowTitle(self.app_name) widget = QWidget(self.main) self.main.setCentralWidget(widget) # Create Grid grid = QGridLayout() # Top Buttons download_btn = QPushButton(QIcon(absp('res/download.svg')), ' Add Link(s)') download_btn.clicked.connect(lambda: self.add_links.show()) settings_btn = QPushButton(QIcon(absp('res/settings.svg')), ' Settings') settings_btn.clicked.connect(lambda: self.settings.show()) # Table self.table = QTableView() headers = [ 'Name', 'Size', 'Status', 'Down Speed', 'Progress', 'Password' ] self.table.setSizeAdjustPolicy( QAbstractScrollArea.AdjustToContentsOnFirstShow) self.table.horizontalHeader().setStretchLastSection(True) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setSortingEnabled(True) self.table.verticalHeader().hide() self.table_model = QStandardItemModel() self.table_model.setHorizontalHeaderLabels(headers) self.table.setModel(self.table_model) # Append widgets to grid grid.addWidget(download_btn, 0, 0) grid.addWidget(settings_btn, 0, 1) grid.addWidget(self.table, 1, 0, 1, 2) # Bottom Buttons resume_btn = QPushButton(QIcon(absp('res/resume.svg')), ' Resume') resume_btn.clicked.connect(self.actions.resume_download) pause_btn = QPushButton(QIcon(absp('res/pause.svg')), ' Pause') pause_btn.clicked.connect(self.actions.pause_download) stop_btn = QPushButton(QIcon(absp('res/stop.svg')), ' Remove') stop_btn.clicked.connect(self.actions.stop_download) # Add buttons to Horizontal Layout hbox = QHBoxLayout() hbox.addWidget(resume_btn) hbox.addWidget(pause_btn) hbox.addWidget(stop_btn) self.main.setWindowFlags(self.main.windowFlags() & Qt.CustomizeWindowHint) grid.addLayout(hbox, 2, 0, 1, 2) widget.setLayout(grid) self.main.resize(670, 415) self.main.show()
def __init__(self, *args, **kwargs): QTableView.__init__(self, *args, **kwargs)
class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.setWindowTitle("View Table with SQL") container = QWidget() layout_search = QHBoxLayout() self.track = QLineEdit() self.track.setPlaceholderText("Track name...") self.track.textChanged.connect(self.update_query) self.composer = QLineEdit() self.composer.setPlaceholderText("Artist name...") self.composer.textChanged.connect(self.update_query) self.album = QLineEdit() self.album.setPlaceholderText("Album name...") self.album.textChanged.connect(self.update_query) layout_search.addWidget(self.track) layout_search.addWidget(self.composer) layout_search.addWidget(self.album) layout_view = QVBoxLayout() layout_view.addLayout(layout_search) self.table = QTableView() layout_view.addWidget(self.table) container.setLayout(layout_view) self.model = QSqlQueryModel() self.table.setModel(self.model) self.query = QSqlQuery(db=db) self.query.prepare( "SELECT Name, Composer, Album.Title FROM Track " "INNER JOIN Album ON Track.AlbumId=Album.AlbumId WHERE " "Track.Name LIKE '%' || :track_name || '%' AND " "Track.Composer LIKE '%' || :track_composer || '%' AND " "Album.Title LIKE '%' || :album_title || '%'" ) self.update_query() self.setMinimumSize(QSize(1024, 640)) self.setCentralWidget(container) def update_query(self, s=None): # Get the text values from the widgets track_name = self.track.text() track_composer = self.composer.text() album_title = self.album.text() self.query.bindValue(":track_name", track_name) self.query.bindValue(":track_composer", track_composer) self.query.bindValue(":album_title", album_title) self.query.exec_() self.model.setQuery(self.query)
class ReferenceDataDlg(QDialog): def __init__(self, table, title, parent=None): super(ReferenceDataDlg, self).__init__(parent) self.model = QSqlTableModel(self) self.model.setTable(table) self.model.setSort(NAME, Qt.AscendingOrder) self.model.setHeaderData(ID, Qt.Horizontal, "ID") self.model.setHeaderData(NAME, Qt.Horizontal, "Name") self.model.setHeaderData(DESCRIPTION, Qt.Horizontal, "Description") self.model.select() self.view = QTableView() self.view.setModel(self.model) self.view.setSelectionMode(QTableView.SingleSelection) self.view.setSelectionBehavior(QTableView.SelectRows) self.view.setColumnHidden(ID, True) self.view.resizeColumnsToContents() addButton = QPushButton("&Add") deleteButton = QPushButton("&Delete") okButton = QPushButton("&OK") if not MAC: addButton.setFocusPolicy(Qt.NoFocus) deleteButton.setFocusPolicy(Qt.NoFocus) buttonLayout = QHBoxLayout() buttonLayout.addWidget(addButton) buttonLayout.addWidget(deleteButton) buttonLayout.addStretch() buttonLayout.addWidget(okButton) layout = QVBoxLayout() layout.addWidget(self.view) layout.addLayout(buttonLayout) self.setLayout(layout) addButton.clicked.connect(self.addRecord) deleteButton.clicked.connect(self.deleteRecord) okButton.clicked.connect(self.accept) self.setWindowTitle( "Asset Manager - Edit {0} Reference Data".format(title)) def addRecord(self): row = self.model.rowCount() self.model.insertRow(row) index = self.model.index(row, NAME) self.view.setCurrentIndex(index) self.view.edit(index) def deleteRecord(self): index = self.view.currentIndex() if not index.isValid(): return #QSqlDatabase.database().transaction() record = self.model.record(index.row()) id = record.value(ID) table = self.model.tableName() query = QSqlQuery() if table == "actions": query.exec_("SELECT COUNT(*) FROM logs " "WHERE actionid = {0}".format(id)) elif table == "categories": query.exec_("SELECT COUNT(*) FROM assets " "WHERE categoryid = {0}".format(id)) count = 0 if query.next(): count = query.value(0) if count: QMessageBox.information( self, "Delete {0}".format(table), ("Cannot delete {0}<br>" "from the {1} table because it is used by " "{2} records").format(record.value(NAME), table, count)) #QSqlDatabase.database().rollback() return self.model.removeRow(index.row()) self.model.submitAll() self.model.select()
def event(self, event): return QTableView.event(self, event)
class CreateUserView(ViewWidget): def __init__(self): super().__init__() self.v_layout = QVBoxLayout() self.model = CreateUserModel(self) self.controller = CreateUserController(self.model, self) self.init_gui() self.init_main_layout() self.table = QTableView() self.show_table() def show_table(self): self.table.setStyleSheet("selection-background-color: #0f5b8d;" "background-color: #505052;" "color: #f0f4f7;" "font-size:14px;" "gridline-color:#324148;" "text-align:center;") self.table.horizontalHeader().setStyleSheet("background-color:#3b3b3d") self.table.setModel(self.model) self.table.keyReleaseEvent = self.controller.key_input for i in range(4): self.table.setColumnWidth(i, 240) self.table.setModel(self.model) self.table.setEditTriggers(QAbstractItemView.DoubleClicked) self.v_layout.addWidget(self.table) def update_view(self): self.model.update() self.clear_layout() self.show_table()
class MainWindow(QMainWindow): """Класс - основное окно сервера.""" def __init__(self, database, server, config): # Конструктор предка super().__init__() # База данных сервера self.database = database self.server_thread = server self.config = config # Ярлык выхода # self.exitAction = QAction('Выход', self) self.exitAction = QAction(QIcon(EXIT_IMG), 'Exit/Выход', self) self.exitAction.setShortcut('Ctrl+Q') self.exitAction.triggered.connect(qApp.quit) # Кнопка обновить список клиентов self.refresh_button = QAction('Обновить список', self) # Кнопка настроек сервера self.config_btn = QAction('Настройки сервера', self) # Кнопка регистрации пользователя self.register_btn = QAction('Регистрация пользователя', self) # Кнопка удаления пользователя self.remove_btn = QAction('Удаление пользователя', self) # Кнопка вывести историю сообщений self.show_history_button = QAction('История клиентов', self) # Статусбар self.statusBar() self.statusBar().showMessage('Server Working') # Тулбар self.toolbar = self.addToolBar('MainBar') self.toolbar.addAction(self.exitAction) self.toolbar.addAction(self.refresh_button) self.toolbar.addAction(self.show_history_button) self.toolbar.addAction(self.config_btn) self.toolbar.addAction(self.register_btn) self.toolbar.addAction(self.remove_btn) # Настройки геометрии основного окна # Поскольку работать с динамическими размерами мы не умеем, и мало # времени на изучение, размер окна фиксирован. self.setFixedSize(800, 600) self.setWindowTitle('Messaging Server alpha release') # Надпись о том, что ниже список подключённых клиентов self.label = QLabel('Список подключённых клиентов:', self) self.label.setFixedSize(240, 15) # self.label.move(10, 25) self.label.move(17, 38) # Окно со списком подключённых клиентов. self.active_clients_table = QTableView(self) # self.active_clients_table.move(10, 45) self.active_clients_table.move(10, 58) self.active_clients_table.setFixedSize(780, 400) # Таймер, обновляющий список клиентов 1 раз в секунду self.timer = QTimer() self.timer.timeout.connect(self.create_users_model) self.timer.start(1000) # Связываем кнопки с процедурами self.refresh_button.triggered.connect(self.create_users_model) self.show_history_button.triggered.connect(self.show_statistics) self.config_btn.triggered.connect(self.server_config) self.register_btn.triggered.connect(self.reg_user) self.remove_btn.triggered.connect(self.rem_user) # Последним параметром отображаем окно. self.show() def create_users_model(self): """Метод заполняющий таблицу активных пользователей.""" list_users = self.database.active_users_list() list = QStandardItemModel() list.setHorizontalHeaderLabels( ['Имя Клиента', 'IP Адрес', 'Порт', 'Время подключения']) for row in list_users: user, ip, port, time = row user = QStandardItem(user) user.setEditable(False) ip = QStandardItem(ip) ip.setEditable(False) port = QStandardItem(str(port)) port.setEditable(False) # Уберём милисекунды из строки времени, т.к. такая точность не # требуется. time = QStandardItem(str(time.replace(microsecond=0))) time.setEditable(False) list.appendRow([user, ip, port, time]) self.active_clients_table.setModel(list) self.active_clients_table.resizeColumnsToContents() self.active_clients_table.resizeRowsToContents() def show_statistics(self): """Метод создающий окно со статистикой клиентов.""" global stat_window stat_window = StatWindow(self.database) stat_window.show() def server_config(self): """Метод создающий окно с настройками сервера.""" global config_window # Создаём окно и заносим в него текущие параметры config_window = ConfigWindow(self.config) def reg_user(self): """Метод создающий окно регистрации пользователя.""" global reg_window reg_window = RegisterUser(self.database, self.server_thread) reg_window.show() def rem_user(self): """Метод создающий окно удаления пользователя.""" global rem_window rem_window = DelUserDialog(self.database, self.server_thread) rem_window.show()
class ChannelPropertiesDialog(QDialog): def __init__(self, parent, info, title="Channel Properties"): super().__init__(parent) self.setWindowTitle(title) self.model = QStandardItemModel(info["nchan"], 4) self.model.setHorizontalHeaderLabels(["#", "Label", "Type", "Bad"]) for index, ch in enumerate(info["chs"]): item = QStandardItem() item.setData(index, Qt.DisplayRole) item.setFlags(item.flags() & ~Qt.ItemIsEditable) self.model.setItem(index, 0, item) self.model.setItem(index, 1, QStandardItem(ch["ch_name"])) kind = channel_type(info, index).upper() self.model.setItem(index, 2, QStandardItem(str(kind))) bad = QStandardItem() bad.setData(ch["ch_name"] in info["bads"], Qt.UserRole) bad.setCheckable(True) bad.setEditable(False) checked = ch["ch_name"] in info["bads"] bad.setCheckState(Qt.Checked if checked else Qt.Unchecked) self.model.setItem(index, 3, bad) self.model.itemChanged.connect(bad_changed) self.proxymodel = MySortFilterProxyModel() self.proxymodel.setDynamicSortFilter(False) self.proxymodel.setSourceModel(self.model) self.view = QTableView() self.view.setModel(self.proxymodel) self.view.setItemDelegateForColumn(2, ComboBoxDelegate(self.view)) self.view.setEditTriggers(QAbstractItemView.AllEditTriggers) self.view.verticalHeader().setVisible(False) self.view.horizontalHeader().setStretchLastSection(True) self.view.setShowGrid(False) self.view.setSelectionMode(QAbstractItemView.NoSelection) self.view.setSortingEnabled(True) self.view.sortByColumn(0, Qt.AscendingOrder) vbox = QVBoxLayout(self) vbox.addWidget(self.view) self.buttonbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) vbox.addWidget(self.buttonbox) self.buttonbox.accepted.connect(self.accept) self.buttonbox.rejected.connect(self.reject) self.resize(500, 650) self.view.setColumnWidth(0, 75) self.view.setColumnWidth(1, 150) self.view.setColumnWidth(2, 90)
class ProposalsWidget(QWidget): """Widget that displays masternode budget proposals.""" def __init__(self, dialog, model, parent=None): super(ProposalsWidget, self).__init__(parent) self.dialog = dialog self.manager = dialog.manager self.model = model self.proxy_model = QSortFilterProxyModel() self.proxy_model.setSourceModel(self.model) self.view = QTableView() self.view.setModel(self.proxy_model) self.view.setSortingEnabled(True) self.view.setSelectionMode(QAbstractItemView.SingleSelection) self.view.setSelectionBehavior(QAbstractItemView.SelectRows) header = self.view.horizontalHeader() header.setHighlightSections(False) header.setResizeMode(self.model.NAME, QHeaderView.ResizeToContents) header.setResizeMode(self.model.URL, QHeaderView.Stretch) header.setResizeMode(self.model.ADDRESS, QHeaderView.ResizeToContents) header.setResizeMode(self.model.TXID, QHeaderView.ResizeToContents) self.view.verticalHeader().setVisible(False) self.view.sortByColumn(self.model.NAME, Qt.AscendingOrder) self.view.selectionModel().selectionChanged.connect(self.on_view_selection_changed) self.editor = ProposalEditor(self) vbox = QVBoxLayout() vbox.setContentsMargins(0, 0, 0, 0) vbox.addWidget(QLabel(_('Proposals:'))) vbox.addWidget(self.view) vbox.addWidget(self.editor) self.setLayout(vbox) def on_view_selection_changed(self, selected, deselected): """Update the data widget mapper.""" idx = 0 try: idx = selected.indexes()[0] except IndexError: pass self.editor.mapper.setCurrentIndex(idx.row())
class comic_meta_data_editor(QDialog): configGroup = "ComicsProjectManagementTools" # Translatable genre dictionary that has it's translated entries added to the genrelist and from which the untranslated items are taken. acbfGenreList = { "science_fiction": str(i18n("Science Fiction")), "fantasy": str(i18n("Fantasy")), "adventure": str(i18n("Adventure")), "horror": str(i18n("Horror")), "mystery": str(i18n("Mystery")), "crime": str(i18n("Crime")), "military": str(i18n("Military")), "real_life": str(i18n("Real Life")), "superhero": str(i18n("Superhero")), "humor": str(i18n("Humor")), "western": str(i18n("Western")), "manga": str(i18n("Manga")), "politics": str(i18n("Politics")), "caricature": str(i18n("Caricature")), "sports": str(i18n("Sports")), "history": str(i18n("History")), "biography": str(i18n("Biography")), "education": str(i18n("Education")), "computer": str(i18n("Computer")), "religion": str(i18n("Religion")), "romance": str(i18n("Romance")), "children": str(i18n("Children")), "non-fiction": str(i18n("Non Fiction")), "adult": str(i18n("Adult")), "alternative": str(i18n("Alternative")), "other": str(i18n("Other")) } acbfAuthorRolesList = { "Writer": str(i18n("Writer")), "Adapter": str(i18n("Adapter")), "Artist": str(i18n("Artist")), "Penciller": str(i18n("Penciller")), "Inker": str(i18n("Inker")), "Colorist": str(i18n("Colorist")), "Letterer": str(i18n("Letterer")), "Cover Artist": str(i18n("Cover Artist")), "Photographer": str(i18n("Photographer")), "Editor": str(i18n("Editor")), "Assistant Editor": str(i18n("Assistant Editor")), "Translator": str(i18n("Translator")), "Other": str(i18n("Other")) } def __init__(self): super().__init__() # Get the keys for the autocompletion. self.genreKeysList = [] self.characterKeysList = [] self.ratingKeysList = {} self.formatKeysList = [] self.otherKeysList = [] self.authorRoleList = [] for g in self.acbfGenreList.values(): self.genreKeysList.append(g) for r in self.acbfAuthorRolesList.values(): self.authorRoleList.append(r) mainP = Path(os.path.abspath(__file__)).parent self.get_auto_completion_keys(mainP) extraKeyP = Path(QDir.homePath()) / Application.readSetting( self.configGroup, "extraKeysLocation", str()) self.get_auto_completion_keys(extraKeyP) # Setup the dialog. self.setLayout(QVBoxLayout()) mainWidget = QTabWidget() self.layout().addWidget(mainWidget) self.setWindowTitle(i18n("Comic Metadata")) buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.layout().addWidget(buttons) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) # Title, concept, summary, genre, characters, format, rating, language, series, other keywords metadataPage = QWidget() mformLayout = QFormLayout() metadataPage.setLayout(mformLayout) self.lnTitle = QLineEdit() self.lnTitle.setToolTip(i18n("The proper title of the comic.")) self.teSummary = QPlainTextEdit() self.teSummary.setToolTip( i18n("What will you tell others to entice them to read your comic?" )) self.lnGenre = QLineEdit() genreCompletion = multi_entry_completer() genreCompletion.setModel(QStringListModel(self.genreKeysList)) self.lnGenre.setCompleter(genreCompletion) genreCompletion.setCaseSensitivity(False) self.lnGenre.setToolTip( i18n( "The genre of the work. Prefilled values are from the ACBF, but you can fill in your own. Separate genres with commas. Try to limit the amount to about two or three" )) self.lnCharacters = QLineEdit() characterCompletion = multi_entry_completer() characterCompletion.setModel(QStringListModel(self.characterKeysList)) characterCompletion.setCaseSensitivity(False) characterCompletion.setFilterMode( Qt.MatchContains ) # So that if there is a list of names with last names, people can type in a last name. self.lnCharacters.setCompleter(characterCompletion) self.lnCharacters.setToolTip( i18n( "The names of the characters that this comic revolves around. Comma-separated." )) self.lnFormat = QLineEdit() formatCompletion = multi_entry_completer() formatCompletion.setModel(QStringListModel(self.formatKeysList)) formatCompletion.setCaseSensitivity(False) self.lnFormat.setCompleter(formatCompletion) ratingLayout = QHBoxLayout() self.cmbRatingSystem = QComboBox() self.cmbRatingSystem.addItems(self.ratingKeysList.keys()) self.cmbRatingSystem.setEditable(True) self.cmbRating = QComboBox() self.cmbRating.setEditable(True) self.cmbRatingSystem.currentIndexChanged.connect( self.slot_refill_ratings) ratingLayout.addWidget(self.cmbRatingSystem) ratingLayout.addWidget(self.cmbRating) self.lnSeriesName = QLineEdit() self.lnSeriesName.setToolTip( i18n( "If this is part of a series, enter the name of the series and the number." )) self.spnSeriesNumber = QSpinBox() self.spnSeriesNumber.setPrefix("No. ") self.spnSeriesVol = QSpinBox() self.spnSeriesVol.setPrefix("Vol. ") seriesLayout = QHBoxLayout() seriesLayout.addWidget(self.lnSeriesName) seriesLayout.addWidget(self.spnSeriesVol) seriesLayout.addWidget(self.spnSeriesNumber) otherCompletion = multi_entry_completer() otherCompletion.setModel(QStringListModel(self.otherKeysList)) otherCompletion.setCaseSensitivity(False) otherCompletion.setFilterMode(Qt.MatchContains) self.lnOtherKeywords = QLineEdit() self.lnOtherKeywords.setCompleter(otherCompletion) self.lnOtherKeywords.setToolTip( i18n( "Other keywords that don't fit in the previously mentioned sets. As always, comma-separated" )) self.cmbLanguage = language_combo_box() self.cmbReadingMode = QComboBox() self.cmbReadingMode.addItem(i18n("Left to Right")) self.cmbReadingMode.addItem(i18n("Right to Left")) self.cmbCoverPage = QComboBox() self.cmbCoverPage.setToolTip( i18n( "Which page is the cover page? This will be empty if there's no pages." )) mformLayout.addRow(i18n("Title:"), self.lnTitle) mformLayout.addRow(i18n("Cover Page:"), self.cmbCoverPage) mformLayout.addRow(i18n("Summary:"), self.teSummary) mformLayout.addRow(i18n("Language:"), self.cmbLanguage) mformLayout.addRow(i18n("Reading Direction:"), self.cmbReadingMode) mformLayout.addRow(i18n("Genre:"), self.lnGenre) mformLayout.addRow(i18n("Characters:"), self.lnCharacters) mformLayout.addRow(i18n("Format:"), self.lnFormat) mformLayout.addRow(i18n("Rating:"), ratingLayout) mformLayout.addRow(i18n("Series:"), seriesLayout) mformLayout.addRow(i18n("Other:"), self.lnOtherKeywords) mainWidget.addTab(metadataPage, i18n("Work")) # The page for the authors. authorPage = QWidget() authorPage.setLayout(QVBoxLayout()) explanation = QLabel( i18n( "The following is a table of the authors that contributed to this comic. You can set their nickname, proper names (first, middle, last), Role (Penciller, Inker, etc), email and homepage." )) explanation.setWordWrap(True) self.authorModel = QStandardItemModel(0, 7) labels = [ i18n("Nick Name"), i18n("Given Name"), i18n("Middle Name"), i18n("Family Name"), i18n("Role"), i18n("Email"), i18n("Homepage"), i18n("Language") ] self.authorModel.setHorizontalHeaderLabels(labels) self.authorTable = QTableView() self.authorTable.setModel(self.authorModel) self.authorTable.verticalHeader().setDragEnabled(True) self.authorTable.verticalHeader().setDropIndicatorShown(True) self.authorTable.verticalHeader().setSectionsMovable(True) self.authorTable.verticalHeader().sectionMoved.connect( self.slot_reset_author_row_visual) delegate = author_delegate() delegate.setCompleterData(self.authorRoleList, 4) delegate.setLanguageData(len(labels) - 1) self.authorTable.setItemDelegate(delegate) author_button_layout = QWidget() author_button_layout.setLayout(QHBoxLayout()) btn_add_author = QPushButton(i18n("Add Author")) btn_add_author.clicked.connect(self.slot_add_author) btn_remove_author = QPushButton(i18n("Remove Author")) btn_remove_author.clicked.connect(self.slot_remove_author) author_button_layout.layout().addWidget(btn_add_author) author_button_layout.layout().addWidget(btn_remove_author) authorPage.layout().addWidget(explanation) authorPage.layout().addWidget(self.authorTable) authorPage.layout().addWidget(author_button_layout) mainWidget.addTab(authorPage, i18n("Authors")) # The page with publisher information. publisherPage = QWidget() publisherLayout = QFormLayout() publisherPage.setLayout(publisherLayout) self.publisherName = QLineEdit() self.publisherName.setToolTip( i18n( "The name of the company, group or person who is responsible for the final version the reader gets." )) publishDateLayout = QHBoxLayout() self.publishDate = QDateEdit() self.publishDate.setDisplayFormat(QLocale().system().dateFormat()) currentDate = QPushButton(i18n("Set Today")) currentDate.setToolTip( i18n("Sets the publish date to the current date.")) currentDate.clicked.connect(self.slot_set_date) publishDateLayout.addWidget(self.publishDate) publishDateLayout.addWidget(currentDate) self.publishCity = QLineEdit() self.publishCity.setToolTip( i18n( "Traditional publishers are always mentioned in source with the city they are located." )) self.isbn = QLineEdit() self.license = license_combo_box( ) # Maybe ought to make this a QLineEdit... self.license.setEditable(True) self.license.completer().setCompletionMode(QCompleter.PopupCompletion) publisherLayout.addRow(i18n("Name:"), self.publisherName) publisherLayout.addRow(i18n("City:"), self.publishCity) publisherLayout.addRow(i18n("Date:"), publishDateLayout) publisherLayout.addRow(i18n("ISBN:"), self.isbn) publisherLayout.addRow(i18n("License:"), self.license) mainWidget.addTab(publisherPage, i18n("Publisher")) """ 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.authorTable.verticalHeader().count()): headerLabelList.append(str(i)) for i in range(self.authorTable.verticalHeader().count()): logicalI = self.authorTable.verticalHeader().logicalIndex(i) headerLabelList[logicalI] = str(i + 1) self.authorModel.setVerticalHeaderLabels(headerLabelList) """ Set the publish date to the current date. """ def slot_set_date(self): self.publishDate.setDate(QDate().currentDate()) """ Append keys to autocompletion lists from the directory mainP. """ def get_auto_completion_keys(self, mainP=Path()): genre = Path(mainP / "key_genre") characters = Path(mainP / "key_characters") rating = Path(mainP / "key_rating") format = Path(mainP / "key_format") keywords = Path(mainP / "key_other") authorRole = Path(mainP / "key_author_roles") if genre.exists(): for t in list(genre.glob('**/*.txt')): file = open(str(t), "r", errors="replace") for l in file: if str(l).strip("\n") not in self.genreKeysList: self.genreKeysList.append(str(l).strip("\n")) file.close() if characters.exists(): for t in list(characters.glob('**/*.txt')): file = open(str(t), "r", errors="replace") for l in file: if str(l).strip("\n") not in self.characterKeysList: self.characterKeysList.append(str(l).strip("\n")) file.close() if format.exists(): for t in list(format.glob('**/*.txt')): file = open(str(t), "r", errors="replace") for l in file: if str(l).strip("\n") not in self.formatKeysList: self.formatKeysList.append(str(l).strip("\n")) file.close() if rating.exists(): for t in list(rating.glob('**/*.csv')): file = open(str(t), "r", newline="", encoding="utf-8") ratings = csv.reader(file) title = os.path.basename(str(t)) r = 0 for row in ratings: listItem = [] if r is 0: title = row[1] else: listItem = self.ratingKeysList[title] item = [] item.append(row[0]) item.append(row[1]) listItem.append(item) self.ratingKeysList[title] = listItem r += 1 file.close() if keywords.exists(): for t in list(keywords.glob('**/*.txt')): file = open(str(t), "r", errors="replace") for l in file: if str(l).strip("\n") not in self.otherKeysList: self.otherKeysList.append(str(l).strip("\n")) file.close() if authorRole.exists(): for t in list(authorRole.glob('**/*.txt')): file = open(str(t), "r", errors="replace") for l in file: if str(l).strip("\n") not in self.authorRoleList: self.authorRoleList.append(str(l).strip("\n")) file.close() """ Refill the ratings box. This is called whenever the rating system changes. """ def slot_refill_ratings(self): if self.cmbRatingSystem.currentText() in self.ratingKeysList.keys(): self.cmbRating.clear() model = QStandardItemModel() for i in self.ratingKeysList[self.cmbRatingSystem.currentText()]: item = QStandardItem() item.setText(i[0]) item.setToolTip(i[1]) model.appendRow(item) self.cmbRating.setModel(model) """ 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()) # role listItems.append(QStandardItem()) # email listItems.append(QStandardItem()) # homepage language = QLocale.system().name().split("_")[0] if language == "C": language = "en" listItems.append(QStandardItem(language)) # Language self.authorModel.appendRow(listItems) """ Remove the selected author from the author list. """ def slot_remove_author(self): self.authorModel.removeRow(self.authorTable.currentIndex().row()) """ Load the UI values from the config dictionary given. """ def setConfig(self, config): if "title" in config.keys(): self.lnTitle.setText(config["title"]) self.teSummary.clear() if "pages" in config.keys(): self.cmbCoverPage.clear() for page in config["pages"]: self.cmbCoverPage.addItem(page) if "cover" in config.keys(): if config["cover"] in config["pages"]: self.cmbCoverPage.setCurrentText(config["cover"]) if "summary" in config.keys(): self.teSummary.appendPlainText(config["summary"]) if "genre" in config.keys(): genreList = [] for genre in config["genre"]: if genre in self.acbfGenreList.keys(): genreList.append(self.acbfGenreList[genre]) else: genreList.append(genre) self.lnGenre.setText(", ".join(genreList)) if "characters" in config.keys(): self.lnCharacters.setText(", ".join(config["characters"])) if "format" in config.keys(): self.lnFormat.setText(", ".join(config["format"])) if "rating" in config.keys(): self.cmbRating.setCurrentText(config["rating"]) else: self.cmbRating.setCurrentText("") if "ratingSystem" in config.keys(): self.cmbRatingSystem.setCurrentText(config["ratingSystem"]) else: self.cmbRatingSystem.setCurrentText("") if "otherKeywords" in config.keys(): self.lnOtherKeywords.setText(", ".join(config["otherKeywords"])) if "seriesName" in config.keys(): self.lnSeriesName.setText(config["seriesName"]) if "seriesVolume" in config.keys(): self.spnSeriesVol.setValue(config["seriesVolume"]) if "seriesNumber" in config.keys(): self.spnSeriesNumber.setValue(config["seriesNumber"]) if "language" in config.keys(): code = config["language"] if "_" in code: code = code.split("_")[0] self.cmbLanguage.setEntryToCode(code) if "readingDirection" in config.keys(): if config["readingDirection"] is "leftToRight": self.cmbReadingMode.setCurrentIndex(0) else: self.cmbReadingMode.setCurrentIndex(1) else: self.cmbReadingMode.setCurrentIndex( QLocale( self.cmbLanguage.codeForCurrentEntry()).textDirection()) if "publisherName" in config.keys(): self.publisherName.setText(config["publisherName"]) if "publisherCity" in config.keys(): self.publishCity.setText(config["publisherCity"]) if "publishingDate" in config.keys(): self.publishDate.setDate( QDate.fromString(config["publishingDate"], Qt.ISODate)) if "isbn-number" in config.keys(): self.isbn.setText(config["isbn-number"]) if "license" in config.keys(): self.license.setCurrentText(config["license"]) else: self.license.setCurrentText( "" ) # I would like to keep it ambiguous whether the artist has thought about the license or not. if "authorList" in config.keys(): authorList = config["authorList"] for i in range(len(authorList)): author = authorList[i] if len(author.keys()) > 0: listItems = [] authorNickName = QStandardItem() if "nickname" in author.keys(): authorNickName.setText(author["nickname"]) listItems.append(authorNickName) authorFirstName = QStandardItem() if "first-name" in author.keys(): authorFirstName.setText(author["first-name"]) listItems.append(authorFirstName) authorMiddleName = QStandardItem() if "initials" in author.keys(): authorMiddleName.setText(author["initials"]) listItems.append(authorMiddleName) authorLastName = QStandardItem() if "last-name" in author.keys(): authorLastName.setText(author["last-name"]) listItems.append(authorLastName) authorRole = QStandardItem() if "role" in author.keys(): role = author["role"] if author["role"] in self.acbfAuthorRolesList.keys(): role = self.acbfAuthorRolesList[author["role"]] authorRole.setText(role) listItems.append(authorRole) authorEMail = QStandardItem() if "email" in author.keys(): authorEMail.setText(author["email"]) listItems.append(authorEMail) authorHomePage = QStandardItem() if "homepage" in author.keys(): authorHomePage.setText(author["homepage"]) listItems.append(authorHomePage) authorLanguage = QStandardItem() if "language" in author.keys(): authorLanguage.setText(author["language"]) pass listItems.append(authorLanguage) self.authorModel.appendRow(listItems) else: self.slot_add_author() """ Store the GUI values into the config dictionary given. @return the config diactionary filled with new values. """ def getConfig(self, config): text = self.lnTitle.text() if len(text) > 0 and text.isspace() is False: config["title"] = text elif "title" in config.keys(): config.pop("title") config["cover"] = self.cmbCoverPage.currentText() listkeys = self.lnGenre.text() if len(listkeys) > 0 and listkeys.isspace() is False: genreList = [] for genre in self.lnGenre.text().split(", "): if genre in self.acbfGenreList.values(): i = list(self.acbfGenreList.values()).index(genre) genreList.append(list(self.acbfGenreList.keys())[i]) else: genreList.append(genre) config["genre"] = genreList elif "genre" in config.keys(): config.pop("genre") listkeys = self.lnCharacters.text() if len(listkeys) > 0 and listkeys.isspace() is False: config["characters"] = self.lnCharacters.text().split(", ") elif "characters" in config.keys(): config.pop("characters") listkeys = self.lnFormat.text() if len(listkeys) > 0 and listkeys.isspace() is False: config["format"] = self.lnFormat.text().split(", ") elif "format" in config.keys(): config.pop("format") config["ratingSystem"] = self.cmbRatingSystem.currentText() config["rating"] = self.cmbRating.currentText() listkeys = self.lnOtherKeywords.text() if len(listkeys) > 0 and listkeys.isspace() is False: config["otherKeywords"] = self.lnOtherKeywords.text().split(", ") elif "characters" in config.keys(): config.pop("otherKeywords") text = self.teSummary.toPlainText() if len(text) > 0 and text.isspace() is False: config["summary"] = text elif "summary" in config.keys(): config.pop("summary") if len(self.lnSeriesName.text()) > 0: config["seriesName"] = self.lnSeriesName.text() config["seriesNumber"] = self.spnSeriesNumber.value() if self.spnSeriesVol.value() > 0: config["seriesVolume"] = self.spnSeriesVol.value() config["language"] = str(self.cmbLanguage.codeForCurrentEntry()) if self.cmbReadingMode is Qt.LeftToRight: config["readingDirection"] = "leftToRight" else: config["readingDirection"] = "rightToLeft" authorList = [] for row in range(self.authorTable.verticalHeader().count()): logicalIndex = self.authorTable.verticalHeader().logicalIndex(row) listEntries = [ "nickname", "first-name", "initials", "last-name", "role", "email", "homepage", "language" ] author = {} for i in range(len(listEntries)): entry = self.authorModel.data( self.authorModel.index(logicalIndex, i)) if entry is None: entry = " " if entry.isspace() is False and len(entry) > 0: if listEntries[i] == "role": if entry in self.acbfAuthorRolesList.values(): entryI = list( self.acbfAuthorRolesList.values()).index(entry) entry = list( self.acbfAuthorRolesList.keys())[entryI] author[listEntries[i]] = entry elif listEntries[i] in author.keys(): author.pop(listEntries[i]) authorList.append(author) config["authorList"] = authorList config["publisherName"] = self.publisherName.text() config["publisherCity"] = self.publishCity.text() config["publishingDate"] = self.publishDate.date().toString(Qt.ISODate) config["isbn-number"] = self.isbn.text() config["license"] = self.license.currentText() return config
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.setMinimumHeight(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()
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.setMinimumHeight(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) ######################### # 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') # when qtvcp closes this gets called # record jump list paths def closing_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')
class MainWindow(QMainWindow): dominion_url = "https://dominion.games/" def __init__(self): super(MainWindow, self).__init__() self.desktop = QDesktopWidget() self.setWindowTitle("Dominion Battle Station") self.setWindowIcon(QIcon("media/favicon.ico")) self.setGeometry(self.desktop.screenGeometry(1)) self.showMaximized() self.initUI() self.listening = False def initUI(self): self.mainwidget = QWidget(self) self.setCentralWidget(self.mainwidget) self.leftframe = QFrame(self.mainwidget) self.leftframe.setFrameStyle(QFrame.Box) self.rightframe = QFrame(self.mainwidget) self.mainhbox = QHBoxLayout() self.mainhbox.addWidget(self.leftframe) self.mainhbox.addWidget(self.rightframe) self.p1frame = QFrame(parent=self.leftframe) # self.p1frame.setStyle(QFrame.Panel) # self.p1frame.setFrameStyle(QFrame.Panel) self.p1tableview = QTableView(self.p1frame) self.p2frame = QGroupBox("Player 2", parent=self.leftframe) # self.p2frame.setFrameStyle(QFrame.Panel) # self.p2tableview = QTableView(self.p2frame) self.leftframevbox = QVBoxLayout() self.leftframevbox.addWidget(self.p1frame) self.leftframevbox.addWidget(self.p2frame) self.leftframe.setLayout(self.leftframevbox) self.mainwidget.setLayout(self.mainhbox) self.toolbar = self.addToolBar("Connect") start_browser = QAction(QIcon("media/favicon.ico"), "start", self) listener_status = QAction( QIcon(self.style().standardIcon(QStyle.SP_DialogNoButton)), "listen", self) self.autologin = QCheckBox("Auto-Login") start_browser.triggered.connect(self.start_webdriver) listener_status.triggered.connect(self.start_listener) self.toolbar.addAction(start_browser) self.toolbar.addWidget(self.autologin) self.toolbar.addAction(listener_status) self.show() def wait_for_presence_of_element(self, name, by, waittime=10): try: return WebDriverWait(self.webdriver, waittime).until( EC.presence_of_element_located((getattr(By, by), name))) except: print("Konnte Element nicht finden: ", name) def start_webdriver(self): self.webdriver = webdriver.Firefox() self.scraper = DominionScraper(self.webdriver) self.scraper.createtable.connect(self.createTable) self.webdriver.get(MainWindow.dominion_url) if self.autologin.isChecked(): print("trying autologin") username_input = self.wait_for_presence_of_element( "username-input", "ID") username_input.clear() username_input.send_keys("schlafi") passwd_input = self.wait_for_presence_of_element( "password", "NAME") passwd_input.clear() passwd_input.send_keys("ganxta89") passwd_input.submit() def start_listener(self): if self.browser: self.listening = True # self.ListenThread.start() else: QMessageBox.critical( self, "Kein Webdriver", "Starte zuerst den Webdriver bevor du den Listener aktivierst", QMessageBox.Ok) # @pyqtSlot(int) # def update_label(self, text): # self.testlabel.setText(str(text)) @pyqtSlot(name="createTable") def createTable(self): print("trying to create table") self.p1tablemodle = PandasTable( self.scraper.game.getPlayerByName("schlafi").deck.cardcountTable) self.p1tableview.setModel(self.p1tablemodle)
# # hb = QHBoxLayout() # hb.addWidget(ui) # # hb.addWidget(bot) # # dia.setLayout(hb) # dia.show() # but = Button() # but.show() # # bot.show() # sys.exit(app.exec_()) # if __name__ == '__main__': app = QApplication(sys.argv) app.setStyle("fusion") tab = QTableView() sti = QStandardItemModel() lista = [] lista.append(QStandardItem()) for i in range(3): lista.append(QStandardItem(str(i))) sti.appendRow(lista) tab.setModel(sti) # wid = QWidget() wid = ComplexLabel(tab) # vbox = QVBoxLayout() # vbox.addWidget(QLabel('hello')) # labIcon = QLabel() # icon = QIcon('sunny.ico') # icon2 = QIcon('iconSpese.ico') # icon.pixmap(QSize(64, 64))
def __init__(self): super().__init__() # Get the keys for the autocompletion. self.genreKeysList = [] self.characterKeysList = [] self.ratingKeysList = {} self.formatKeysList = [] self.otherKeysList = [] self.authorRoleList = [] for g in self.acbfGenreList.values(): self.genreKeysList.append(g) for r in self.acbfAuthorRolesList.values(): self.authorRoleList.append(r) mainP = Path(os.path.abspath(__file__)).parent self.get_auto_completion_keys(mainP) extraKeyP = Path(QDir.homePath()) / Application.readSetting( self.configGroup, "extraKeysLocation", str()) self.get_auto_completion_keys(extraKeyP) # Setup the dialog. self.setLayout(QVBoxLayout()) mainWidget = QTabWidget() self.layout().addWidget(mainWidget) self.setWindowTitle(i18n("Comic Metadata")) buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.layout().addWidget(buttons) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) # Title, concept, summary, genre, characters, format, rating, language, series, other keywords metadataPage = QWidget() mformLayout = QFormLayout() metadataPage.setLayout(mformLayout) self.lnTitle = QLineEdit() self.lnTitle.setToolTip(i18n("The proper title of the comic.")) self.teSummary = QPlainTextEdit() self.teSummary.setToolTip( i18n("What will you tell others to entice them to read your comic?" )) self.lnGenre = QLineEdit() genreCompletion = multi_entry_completer() genreCompletion.setModel(QStringListModel(self.genreKeysList)) self.lnGenre.setCompleter(genreCompletion) genreCompletion.setCaseSensitivity(False) self.lnGenre.setToolTip( i18n( "The genre of the work. Prefilled values are from the ACBF, but you can fill in your own. Separate genres with commas. Try to limit the amount to about two or three" )) self.lnCharacters = QLineEdit() characterCompletion = multi_entry_completer() characterCompletion.setModel(QStringListModel(self.characterKeysList)) characterCompletion.setCaseSensitivity(False) characterCompletion.setFilterMode( Qt.MatchContains ) # So that if there is a list of names with last names, people can type in a last name. self.lnCharacters.setCompleter(characterCompletion) self.lnCharacters.setToolTip( i18n( "The names of the characters that this comic revolves around. Comma-separated." )) self.lnFormat = QLineEdit() formatCompletion = multi_entry_completer() formatCompletion.setModel(QStringListModel(self.formatKeysList)) formatCompletion.setCaseSensitivity(False) self.lnFormat.setCompleter(formatCompletion) ratingLayout = QHBoxLayout() self.cmbRatingSystem = QComboBox() self.cmbRatingSystem.addItems(self.ratingKeysList.keys()) self.cmbRatingSystem.setEditable(True) self.cmbRating = QComboBox() self.cmbRating.setEditable(True) self.cmbRatingSystem.currentIndexChanged.connect( self.slot_refill_ratings) ratingLayout.addWidget(self.cmbRatingSystem) ratingLayout.addWidget(self.cmbRating) self.lnSeriesName = QLineEdit() self.lnSeriesName.setToolTip( i18n( "If this is part of a series, enter the name of the series and the number." )) self.spnSeriesNumber = QSpinBox() self.spnSeriesNumber.setPrefix("No. ") self.spnSeriesVol = QSpinBox() self.spnSeriesVol.setPrefix("Vol. ") seriesLayout = QHBoxLayout() seriesLayout.addWidget(self.lnSeriesName) seriesLayout.addWidget(self.spnSeriesVol) seriesLayout.addWidget(self.spnSeriesNumber) otherCompletion = multi_entry_completer() otherCompletion.setModel(QStringListModel(self.otherKeysList)) otherCompletion.setCaseSensitivity(False) otherCompletion.setFilterMode(Qt.MatchContains) self.lnOtherKeywords = QLineEdit() self.lnOtherKeywords.setCompleter(otherCompletion) self.lnOtherKeywords.setToolTip( i18n( "Other keywords that don't fit in the previously mentioned sets. As always, comma-separated" )) self.cmbLanguage = language_combo_box() self.cmbReadingMode = QComboBox() self.cmbReadingMode.addItem(i18n("Left to Right")) self.cmbReadingMode.addItem(i18n("Right to Left")) self.cmbCoverPage = QComboBox() self.cmbCoverPage.setToolTip( i18n( "Which page is the cover page? This will be empty if there's no pages." )) mformLayout.addRow(i18n("Title:"), self.lnTitle) mformLayout.addRow(i18n("Cover Page:"), self.cmbCoverPage) mformLayout.addRow(i18n("Summary:"), self.teSummary) mformLayout.addRow(i18n("Language:"), self.cmbLanguage) mformLayout.addRow(i18n("Reading Direction:"), self.cmbReadingMode) mformLayout.addRow(i18n("Genre:"), self.lnGenre) mformLayout.addRow(i18n("Characters:"), self.lnCharacters) mformLayout.addRow(i18n("Format:"), self.lnFormat) mformLayout.addRow(i18n("Rating:"), ratingLayout) mformLayout.addRow(i18n("Series:"), seriesLayout) mformLayout.addRow(i18n("Other:"), self.lnOtherKeywords) mainWidget.addTab(metadataPage, i18n("Work")) # The page for the authors. authorPage = QWidget() authorPage.setLayout(QVBoxLayout()) explanation = QLabel( i18n( "The following is a table of the authors that contributed to this comic. You can set their nickname, proper names (first, middle, last), Role (Penciller, Inker, etc), email and homepage." )) explanation.setWordWrap(True) self.authorModel = QStandardItemModel(0, 7) labels = [ i18n("Nick Name"), i18n("Given Name"), i18n("Middle Name"), i18n("Family Name"), i18n("Role"), i18n("Email"), i18n("Homepage"), i18n("Language") ] self.authorModel.setHorizontalHeaderLabels(labels) self.authorTable = QTableView() self.authorTable.setModel(self.authorModel) self.authorTable.verticalHeader().setDragEnabled(True) self.authorTable.verticalHeader().setDropIndicatorShown(True) self.authorTable.verticalHeader().setSectionsMovable(True) self.authorTable.verticalHeader().sectionMoved.connect( self.slot_reset_author_row_visual) delegate = author_delegate() delegate.setCompleterData(self.authorRoleList, 4) delegate.setLanguageData(len(labels) - 1) self.authorTable.setItemDelegate(delegate) author_button_layout = QWidget() author_button_layout.setLayout(QHBoxLayout()) btn_add_author = QPushButton(i18n("Add Author")) btn_add_author.clicked.connect(self.slot_add_author) btn_remove_author = QPushButton(i18n("Remove Author")) btn_remove_author.clicked.connect(self.slot_remove_author) author_button_layout.layout().addWidget(btn_add_author) author_button_layout.layout().addWidget(btn_remove_author) authorPage.layout().addWidget(explanation) authorPage.layout().addWidget(self.authorTable) authorPage.layout().addWidget(author_button_layout) mainWidget.addTab(authorPage, i18n("Authors")) # The page with publisher information. publisherPage = QWidget() publisherLayout = QFormLayout() publisherPage.setLayout(publisherLayout) self.publisherName = QLineEdit() self.publisherName.setToolTip( i18n( "The name of the company, group or person who is responsible for the final version the reader gets." )) publishDateLayout = QHBoxLayout() self.publishDate = QDateEdit() self.publishDate.setDisplayFormat(QLocale().system().dateFormat()) currentDate = QPushButton(i18n("Set Today")) currentDate.setToolTip( i18n("Sets the publish date to the current date.")) currentDate.clicked.connect(self.slot_set_date) publishDateLayout.addWidget(self.publishDate) publishDateLayout.addWidget(currentDate) self.publishCity = QLineEdit() self.publishCity.setToolTip( i18n( "Traditional publishers are always mentioned in source with the city they are located." )) self.isbn = QLineEdit() self.license = license_combo_box( ) # Maybe ought to make this a QLineEdit... self.license.setEditable(True) self.license.completer().setCompletionMode(QCompleter.PopupCompletion) publisherLayout.addRow(i18n("Name:"), self.publisherName) publisherLayout.addRow(i18n("City:"), self.publishCity) publisherLayout.addRow(i18n("Date:"), publishDateLayout) publisherLayout.addRow(i18n("ISBN:"), self.isbn) publisherLayout.addRow(i18n("License:"), self.license) mainWidget.addTab(publisherPage, i18n("Publisher"))
def __init__(self, database, server, config): # Конструктор предка super().__init__() # База данных сервера self.database = database self.server_thread = server self.config = config # Ярлык выхода # self.exitAction = QAction('Выход', self) self.exitAction = QAction(QIcon(EXIT_IMG), 'Exit/Выход', self) self.exitAction.setShortcut('Ctrl+Q') self.exitAction.triggered.connect(qApp.quit) # Кнопка обновить список клиентов self.refresh_button = QAction('Обновить список', self) # Кнопка настроек сервера self.config_btn = QAction('Настройки сервера', self) # Кнопка регистрации пользователя self.register_btn = QAction('Регистрация пользователя', self) # Кнопка удаления пользователя self.remove_btn = QAction('Удаление пользователя', self) # Кнопка вывести историю сообщений self.show_history_button = QAction('История клиентов', self) # Статусбар self.statusBar() self.statusBar().showMessage('Server Working') # Тулбар self.toolbar = self.addToolBar('MainBar') self.toolbar.addAction(self.exitAction) self.toolbar.addAction(self.refresh_button) self.toolbar.addAction(self.show_history_button) self.toolbar.addAction(self.config_btn) self.toolbar.addAction(self.register_btn) self.toolbar.addAction(self.remove_btn) # Настройки геометрии основного окна # Поскольку работать с динамическими размерами мы не умеем, и мало # времени на изучение, размер окна фиксирован. self.setFixedSize(800, 600) self.setWindowTitle('Messaging Server alpha release') # Надпись о том, что ниже список подключённых клиентов self.label = QLabel('Список подключённых клиентов:', self) self.label.setFixedSize(240, 15) # self.label.move(10, 25) self.label.move(17, 38) # Окно со списком подключённых клиентов. self.active_clients_table = QTableView(self) # self.active_clients_table.move(10, 45) self.active_clients_table.move(10, 58) self.active_clients_table.setFixedSize(780, 400) # Таймер, обновляющий список клиентов 1 раз в секунду self.timer = QTimer() self.timer.timeout.connect(self.create_users_model) self.timer.start(1000) # Связываем кнопки с процедурами self.refresh_button.triggered.connect(self.create_users_model) self.show_history_button.triggered.connect(self.show_statistics) self.config_btn.triggered.connect(self.server_config) self.register_btn.triggered.connect(self.reg_user) self.remove_btn.triggered.connect(self.rem_user) # Последним параметром отображаем окно. self.show()
def keyPressEvent(self, event): if event.key() == Qt.Key_F5: self.resizeRowsToContents() self._top_rowid = self.indexAt(self.rect().topLeft()).row() self._bottom_rowid = self.indexAt(self.rect().bottomRight()).row() elif event.key() == Qt.Key_D and event.modifiers( ) & Qt.ControlModifier and self.currentIndex(): rowId = self.currentIndex().row() r = [ self.model().item(rowId, colId).text() for colId in [1, 2, 4, 5, 6, 8, 13, 14] ] cb = QApplication.clipboard() cb.clear(mode=cb.Clipboard) cb.setText(chr(9).join(r), mode=cb.Clipboard) elif ( event.key() == Qt.Key_C or event.key() == Qt.Key_S ) and event.modifiers() & Qt.ControlModifier and self.currentIndex(): try: rowId = self.currentIndex().row() beerId = int(self.model().item(rowId, 0).text()) if beerId in self.beerImages: status = [] if self.model().item(rowId, 6).text() != bytes( [110, 111, 32, 115, 99, 111, 114, 101]).decode(): status.append(self.model().item(rowId, 6).text()) if self.model().item(rowId, 8).text() != bytes( [110, 111, 32, 115, 99, 111, 114, 101]).decode(): status.append(self.model().item(rowId, 8).text()) if self.model().item(rowId, 8).text() == self.model().item( rowId, 6).text(): if self.model().item(rowId, 6).text() != bytes( [110, 111, 32, 115, 99, 111, 114, 101]).decode(): status = [self.model().item(rowId, 8).text()] r = [ self.model().item(rowId, 1).text(), self.model().item(rowId, 2).text(), chr(32).join([ bytes([65, 66, 86, 32, 123, 125, 32, 37]).decode(). format(self.model().item(rowId, 4).text()), ] + status), chr(32).join([ self.model().item(rowId, 13).text(), chr(40), self.model().item(rowId, 5).text(), chr(41) ]), ] pixmap = self._pixmap( open(self.beerImages[beerId][0], ReadWriteFile.READ_BINARY).read(), None) height = pixmap.size().height() width = pixmap.size().width() p = QPixmap(width, height + 12 * len(r)) height = p.size().height() width = p.size().width() with QPainter(p) as painter: painter.drawPixmap(0, 12 * len(r), pixmap) brush = QBrush(QColor(0, 0, 0, 255)) painter.fillRect(0, 0, p.size().width() - 2, 12 * len(r), brush) font = QFont() font.setFamily(bytes([65, 114, 105, 97, 108]).decode()) font.setBold(True) font.setPixelSize(10) painter.setFont(font) pen = QPen() pen.setColor(QColor(255, 255, 0, 255)) painter.setPen(pen) for i, info in enumerate(r, 1): painter.drawText(QPoint(2, i * 10), info) if event.key() == Qt.Key_C: QApplication.clipboard().clear() QApplication.clipboard().setPixmap(p) else: fileName, _ = QFileDialog.getSaveFileName( self, bytes( [83, 97, 118, 101, 32, 73, 109, 97, 103, 101]).decode(), str(beerId), bytes([ 73, 109, 97, 103, 101, 32, 40, 42, 46, 106, 112, 103, 41 ]).decode()) print(fileName) p.save(fileName, bytes([74, 80, 71]).decode()) except Exception as err: print(err) return QTableView.keyPressEvent(self, event)
def __init__(self): super(MainForm, self).__init__() self.assetModel = QSqlRelationalTableModel(self) self.assetModel.setTable("assets") self.assetModel.setRelation(CATEGORYID, QSqlRelation("categories", "id", "name")) self.assetModel.setSort(ROOM, Qt.AscendingOrder) self.assetModel.setHeaderData(ID, Qt.Horizontal, "ID") self.assetModel.setHeaderData(NAME, Qt.Horizontal, "Name") self.assetModel.setHeaderData(CATEGORYID, Qt.Horizontal, "Category") self.assetModel.setHeaderData(ROOM, Qt.Horizontal, "Room") self.assetModel.select() self.assetView = QTableView() self.assetView.setModel(self.assetModel) self.assetView.setItemDelegate(AssetDelegate(self)) self.assetView.setSelectionMode(QTableView.SingleSelection) self.assetView.setSelectionBehavior(QTableView.SelectRows) self.assetView.setColumnHidden(ID, True) self.assetView.resizeColumnsToContents() assetLabel = QLabel("A&ssets") assetLabel.setBuddy(self.assetView) self.logModel = QSqlRelationalTableModel(self) self.logModel.setTable("logs") self.logModel.setRelation(ACTIONID, QSqlRelation("actions", "id", "name")) self.logModel.setSort(DATE, Qt.AscendingOrder) self.logModel.setHeaderData(DATE, Qt.Horizontal, "Date") self.logModel.setHeaderData(ACTIONID, Qt.Horizontal, "Action") self.logModel.select() self.logView = QTableView() self.logView.setModel(self.logModel) self.logView.setItemDelegate(LogDelegate(self)) self.logView.setSelectionMode(QTableView.SingleSelection) self.logView.setSelectionBehavior(QTableView.SelectRows) self.logView.setColumnHidden(ID, True) self.logView.setColumnHidden(ASSETID, True) self.logView.resizeColumnsToContents() self.logView.horizontalHeader().setStretchLastSection(True) logLabel = QLabel("&Logs") logLabel.setBuddy(self.logView) addAssetButton = QPushButton("&Add Asset") deleteAssetButton = QPushButton("&Delete Asset") addActionButton = QPushButton("Add A&ction") deleteActionButton = QPushButton("Delete Ac&tion") editActionsButton = QPushButton("&Edit Actions...") editCategoriesButton = QPushButton("Ed&it Categories...") quitButton = QPushButton("&Quit") for button in (addAssetButton, deleteAssetButton, addActionButton, deleteActionButton, editActionsButton, editCategoriesButton, quitButton): if MAC: button.setDefault(False) button.setAutoDefault(False) else: button.setFocusPolicy(Qt.NoFocus) dataLayout = QVBoxLayout() dataLayout.addWidget(assetLabel) dataLayout.addWidget(self.assetView, 1) dataLayout.addWidget(logLabel) dataLayout.addWidget(self.logView) buttonLayout = QVBoxLayout() buttonLayout.addWidget(addAssetButton) buttonLayout.addWidget(deleteAssetButton) buttonLayout.addWidget(addActionButton) buttonLayout.addWidget(deleteActionButton) buttonLayout.addWidget(editActionsButton) buttonLayout.addWidget(editCategoriesButton) buttonLayout.addStretch() buttonLayout.addWidget(quitButton) layout = QHBoxLayout() layout.addLayout(dataLayout, 1) layout.addLayout(buttonLayout) self.setLayout(layout) #self.connect(self.assetView.selectionModel(), #SIGNAL(("currentRowChanged(QModelIndex,QModelIndex)")), #self.assetChanged) self.assetView.selectionModel().currentRowChanged.connect( self.assetChanged) addAssetButton.clicked.connect(self.addAsset) deleteAssetButton.clicked.connect(self.deleteAsset) addActionButton.clicked.connect(self.addAction) deleteActionButton.clicked.connect(self.deleteAction) editActionsButton.clicked.connect(self.editActions) editCategoriesButton.clicked.connect(self.editCategories) quitButton.clicked.connect(self.done) self.assetChanged(self.assetView.currentIndex()) self.setMinimumWidth(650) self.setWindowTitle("Asset Manager")
def __init__(self, parent=None): QTableView.__init__(self, parent)
class MainForm(QDialog): def __init__(self): super(MainForm, self).__init__() self.assetModel = QSqlRelationalTableModel(self) self.assetModel.setTable("assets") self.assetModel.setRelation(CATEGORYID, QSqlRelation("categories", "id", "name")) self.assetModel.setSort(ROOM, Qt.AscendingOrder) self.assetModel.setHeaderData(ID, Qt.Horizontal, "ID") self.assetModel.setHeaderData(NAME, Qt.Horizontal, "Name") self.assetModel.setHeaderData(CATEGORYID, Qt.Horizontal, "Category") self.assetModel.setHeaderData(ROOM, Qt.Horizontal, "Room") self.assetModel.select() self.assetView = QTableView() self.assetView.setModel(self.assetModel) self.assetView.setItemDelegate(AssetDelegate(self)) self.assetView.setSelectionMode(QTableView.SingleSelection) self.assetView.setSelectionBehavior(QTableView.SelectRows) self.assetView.setColumnHidden(ID, True) self.assetView.resizeColumnsToContents() assetLabel = QLabel("A&ssets") assetLabel.setBuddy(self.assetView) self.logModel = QSqlRelationalTableModel(self) self.logModel.setTable("logs") self.logModel.setRelation(ACTIONID, QSqlRelation("actions", "id", "name")) self.logModel.setSort(DATE, Qt.AscendingOrder) self.logModel.setHeaderData(DATE, Qt.Horizontal, "Date") self.logModel.setHeaderData(ACTIONID, Qt.Horizontal, "Action") self.logModel.select() self.logView = QTableView() self.logView.setModel(self.logModel) self.logView.setItemDelegate(LogDelegate(self)) self.logView.setSelectionMode(QTableView.SingleSelection) self.logView.setSelectionBehavior(QTableView.SelectRows) self.logView.setColumnHidden(ID, True) self.logView.setColumnHidden(ASSETID, True) self.logView.resizeColumnsToContents() self.logView.horizontalHeader().setStretchLastSection(True) logLabel = QLabel("&Logs") logLabel.setBuddy(self.logView) addAssetButton = QPushButton("&Add Asset") deleteAssetButton = QPushButton("&Delete Asset") addActionButton = QPushButton("Add A&ction") deleteActionButton = QPushButton("Delete Ac&tion") editActionsButton = QPushButton("&Edit Actions...") editCategoriesButton = QPushButton("Ed&it Categories...") quitButton = QPushButton("&Quit") for button in (addAssetButton, deleteAssetButton, addActionButton, deleteActionButton, editActionsButton, editCategoriesButton, quitButton): if MAC: button.setDefault(False) button.setAutoDefault(False) else: button.setFocusPolicy(Qt.NoFocus) dataLayout = QVBoxLayout() dataLayout.addWidget(assetLabel) dataLayout.addWidget(self.assetView, 1) dataLayout.addWidget(logLabel) dataLayout.addWidget(self.logView) buttonLayout = QVBoxLayout() buttonLayout.addWidget(addAssetButton) buttonLayout.addWidget(deleteAssetButton) buttonLayout.addWidget(addActionButton) buttonLayout.addWidget(deleteActionButton) buttonLayout.addWidget(editActionsButton) buttonLayout.addWidget(editCategoriesButton) buttonLayout.addStretch() buttonLayout.addWidget(quitButton) layout = QHBoxLayout() layout.addLayout(dataLayout, 1) layout.addLayout(buttonLayout) self.setLayout(layout) #self.connect(self.assetView.selectionModel(), #SIGNAL(("currentRowChanged(QModelIndex,QModelIndex)")), #self.assetChanged) self.assetView.selectionModel().currentRowChanged.connect( self.assetChanged) addAssetButton.clicked.connect(self.addAsset) deleteAssetButton.clicked.connect(self.deleteAsset) addActionButton.clicked.connect(self.addAction) deleteActionButton.clicked.connect(self.deleteAction) editActionsButton.clicked.connect(self.editActions) editCategoriesButton.clicked.connect(self.editCategories) quitButton.clicked.connect(self.done) self.assetChanged(self.assetView.currentIndex()) self.setMinimumWidth(650) self.setWindowTitle("Asset Manager") def done(self, result=1): query = QSqlQuery() query.exec_("DELETE FROM logs WHERE logs.assetid NOT IN" "(SELECT id FROM assets)") QDialog.done(self, 1) def assetChanged(self, index): if index.isValid(): record = self.assetModel.record(index.row()) #print(index.row()) id = record.value("id") self.logModel.setFilter("assetid = {0}".format(id)) else: self.logModel.setFilter("assetid = -1") #self.logModel.reset() # workaround for Qt <= 4.3.3/SQLite bug #self.logModel.beginResetModel() self.logModel.select() self.logView.horizontalHeader().setVisible( self.logModel.rowCount() > 0) if PYQT_VERSION_STR < "4.1.0": self.logView.setColumnHidden(ID, True) self.logView.setColumnHidden(ASSETID, True) #self.logModel.endResetModel() def addAsset(self): row = (self.assetView.currentIndex().row() if self.assetView.currentIndex().isValid() else 0) QSqlDatabase.database().transaction() self.assetModel.insertRow(row) index = self.assetModel.index(row, NAME) self.assetView.setCurrentIndex(index) assetid = 1 query = QSqlQuery() query.exec_("SELECT MAX(id) FROM assets") if query.next(): assetid = query.value(0) query.prepare("INSERT INTO logs (assetid, date, actionid) " "VALUES (:assetid, :date, :actionid)") query.bindValue(":assetid", assetid + 1) query.bindValue(":date", QDate.currentDate()) query.bindValue(":actionid", ACQUIRED) query.exec_() QSqlDatabase.database().commit() #self.logModel.select() self.assetView.edit(index) def deleteAsset(self): index = self.assetView.currentIndex() if not index.isValid(): return QSqlDatabase.database().transaction() record = self.assetModel.record(index.row()) assetid = record.value(ID) logrecords = 1 query = QSqlQuery( "SELECT COUNT(*) FROM logs WHERE assetid = {0}".format(assetid)) if query.next(): logrecords = query.value(0) msg = ("<font color=red>Delete</font><br><b>{0}</b>" "<br>from room {1}").format(record.value(NAME), record.value(ROOM)) if logrecords > 1: msg += (", along with {0} log records".format(logrecords)) msg += "?" if (QMessageBox.question(self, "Delete Asset", msg, QMessageBox.Yes | QMessageBox.No) == QMessageBox.No): QSqlDatabase.database().rollback() return #query.exec_("DELETE FROM logs WHERE assetid = {0}" # .format(assetid)) #use model API self.logModel.setFilter("assetid={0}".format(assetid)) self.logModel.select() if self.logModel.rowCount() > 0: self.logModel.removeRows(0, self.logModel.rowCount()) self.logModel.submitAll() self.assetModel.removeRow(index.row()) self.assetModel.submitAll() QSqlDatabase.database().commit() self.assetModel.select() self.assetChanged(self.assetView.currentIndex()) def addAction(self): index = self.assetView.currentIndex() if not index.isValid(): return QSqlDatabase.database().transaction() record = self.assetModel.record(index.row()) assetid = record.value(ID) row = self.logModel.rowCount() self.logModel.insertRow(row) self.logModel.setData(self.logModel.index(row, ASSETID), assetid) self.logModel.setData(self.logModel.index(row, DATE), QDate.currentDate()) QSqlDatabase.database().commit() index = self.logModel.index(row, ACTIONID) self.logView.setCurrentIndex(index) self.logView.edit(index) def deleteAction(self): index = self.logView.currentIndex() if not index.isValid(): return record = self.logModel.record(index.row()) action = record.value(ACTIONID) if action == "Acquired": QMessageBox.information( self, "Delete Log", "The 'Acquired' log record cannot be deleted.<br>" "You could delete the entire asset instead.") return when = str(record.value(DATE)) if (QMessageBox.question(self, "Delete Log", "Delete log<br>{0} {1}?".format(when, action), QMessageBox.Yes | QMessageBox.No) == QMessageBox.No): return self.logModel.removeRow(index.row()) self.logModel.submitAll() self.logModel.select() def editActions(self): form = ReferenceDataDlg("actions", "Action", self) form.exec_() def editCategories(self): form = ReferenceDataDlg("categories", "Category", self) form.exec_()
class ResultFormatManager(QDialog): apply_done = pyqtSignal() def __init__(self, data: list): super().__init__() self.setStyleSheet(open('stylesheet/default.qss').read()) # self.setWindowFlag(Qt.WindowMinimizeButtonHint, True) self.setAttribute(Qt.WA_QuitOnClose) self.data_json = data self.data_json.append("") layout = QVBoxLayout() self.setLayout(layout) self.table = QTableView() self.model = QStandardItemModel() self.model.setHorizontalHeaderLabels(['Object name']) self.model.itemChanged.connect(self.data_change) self.table.setModel(self.model) self.import_data(self.data_json) header = self.table.horizontalHeader() header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) apply = QPushButton() apply.setText("Apply") apply.pressed.connect(self.apply) cancel = QPushButton() cancel.setText("Cancel") cancel.pressed.connect(self.cancel) bar = QHBoxLayout() bar.addStretch() bar.addWidget(cancel, alignment=Qt.AlignRight) bar.addWidget(apply, alignment=Qt.AlignRight) layout.addWidget(self.table) layout.addLayout(bar) def import_data(self, data_list): row = self.model.invisibleRootItem() for data in data_list: item1 = QStandardItem() item1.setText(data) item1.setData(data) item1.setEditable(True) row.appendRow(item1) def cancel(self): self.close() def data_change(self, arg: QStandardItem): data = arg.data() text = arg.text() if data != "" or text != "": index = self.data_json.index(data) self.data_json.insert(index, text) if data != "" and text != "": self.data_json.remove(data) self.model.clear() self.model.setHorizontalHeaderLabels(['Object name']) header = self.table.horizontalHeader() header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) self.import_data(self.data_json) def apply(self): self.apply_done.emit() self.accept() def data(self): return self.data_json def set_data(self, data: list): self.data_json = data
class EventTab(QWidget): """ Widget which represents tab for editing events. """ save_clicked_signal = pyqtSignal() def __init__(self, db: DbModel): super(EventTab, self).__init__() self.__manager = EventManager(db) self.__manager.model.select() self.__create_view() self.setLayout(self.__layout) def __create_view(self): self.__view = QTableView() self.__view.setModel(self.__manager.model) self.__view.setSelectionMode(QAbstractItemView.NoSelection) self.__layout = QVBoxLayout() self.__layout.addWidget(self.__view) self.__layout.addLayout(self.__create_buttons()) self.__set_columns_delegate() self.__set_columns_checkbox([ Resources.EventManager_Column_IsCyclic_Index, Resources.EventManager_Column_IsActive_Index ]) self.__set_columns_visible() self.__set_columns_width() self.__set_columns_title() def __set_columns_delegate(self): self.__delegate_start_date = ItemDelegateDateEdit() self.__delegate_number = ItemDelegateSpinBoxEdit(1) self.__delegate_days = ItemDelegateSpinBoxEdit() self.__delegate_months = ItemDelegateSpinBoxEdit() self.__view.setItemDelegateForColumn(2, self.__delegate_start_date) self.__view.setItemDelegateForColumn(4, self.__delegate_number) self.__view.setItemDelegateForColumn(5, self.__delegate_days) self.__view.setItemDelegateForColumn(6, self.__delegate_months) def __set_columns_checkbox(self, column_list: list): for column in column_list: for row in range(self.__manager.model.rowCount()): self.__set_column_checkbox(row, column) def __set_column_checkbox(self, row: int, column: int): index = self.__manager.model.index(row, column) check_box = CheckBoxEdit(None) check_box.set_property(Resources.EventTab_Property_Row, QVariant(row)) check_box.set_property(Resources.EventTab_Property_Column, QVariant(column)) check_box.state_changed.connect(self.__checkbox_clicked) check_box.checked = bool(index.data()) self.__view.setIndexWidget(index, check_box) def __create_buttons(self): self.__add_button = self.__create_button( Resources.EventTab_BUTTON_NAME_Add, self.__add_clicked) self.__delete_button = self.__create_button( Resources.EventTab_BUTTON_NAME_Delete, self.__delete_clicked) self.__save_button = self.__create_button( Resources.EventTab_BUTTON_NAME_Save, self.__save_clicked) layout = QHBoxLayout() layout.addWidget(self.__add_button) layout.addWidget(self.__delete_button) layout.addStretch(1) layout.addWidget(self.__save_button) return layout def __create_button(self, name: str, fun: object): button = QPushButton(self) button.setText(name) button.clicked.connect(fun) return button def __set_columns_visible(self): for key, value in Resources.EventTab_Columns_Visible.items(): self.__view.setColumnHidden(key, not value) def __set_columns_width(self): for key, value in Resources.EventTab_Columns_Width.items(): self.__view.setColumnWidth(key, value) def __set_columns_title(self): for key, value in Resources.EventTab_Columns_Names.items(): self.__manager.set_header_title(key, value) def __checkbox_clicked(self, state: int): del state sender = self.sender() row = int(sender.property(Resources.EventTab_Property_Row)) column = int(sender.property(Resources.EventTab_Property_Column)) index = self.__manager.model.index(row, column) self.__manager.model.setData(index, sender.isChecked()) def __add_clicked(self): index = self.__manager.insert_row() self.__set_column_checkbox( index, Resources.EventManager_Column_IsCyclic_Index) self.__set_column_checkbox( index, Resources.EventManager_Column_IsActive_Index) def __delete_clicked(self): reply = QMessageBox.warning(self, Resources.EventTab_BUTTON_NAME_Delete, Resources.EventTab_Delete_Message, QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if reply == QMessageBox.No: return selected_indexes = self.__view.selectedIndexes() self.__manager.remove_rows(selected_indexes) def __save_clicked(self): self.__manager.save() self.__set_columns_checkbox([ Resources.EventManager_Column_IsCyclic_Index, Resources.EventManager_Column_IsActive_Index ]) self.save_clicked_signal.emit() Tools.write_verbose_class_name(self, "Save clicked")
class MainWindow(QMainWindow): def __init__(self, system): super(MainWindow, self).__init__() self.system = system fileMenu = QMenu("&Menu", self) dbinitAction = fileMenu.addAction("사용자 정보 초기화") quitAction = fileMenu.addAction("E&xit") quitAction.setShortcut("Ctrl+Q") self.menuBar().addMenu(fileMenu) self.statusBar() dbinitAction.triggered.connect(self.ClickAction_dbinit) quitAction.triggered.connect(QApplication.instance().quit) self.setupModel() self.setupViews() self.readDB() self.setWindowTitle("PyStudy 학습진도창") self.resize(870, 550) def setupModel(self): self.model = QStandardItemModel(3, 2, self) self.model.setHeaderData(0, Qt.Horizontal, "목록") self.model.setHeaderData(1, Qt.Horizontal, "읽기여부") self.model2 = QStandardItemModel(3, 2, self) self.model2.setHeaderData(0, Qt.Horizontal, "학습여부") self.model2.setHeaderData(1, Qt.Horizontal, "개수") def setupViews(self): splitter = QSplitter() self.table = QTableView() self.pieChart = PieView() splitter.addWidget(self.pieChart) splitter.addWidget(self.table) splitter.setStretchFactor(0, 0) splitter.setStretchFactor(1, 0) self.table.setModel(self.model) self.pieChart.setModel(self.model2) self.selectionModel = QItemSelectionModel(self.model2) self.table.setSelectionModel(self.selectionModel) #self.pieChart.setSelectionModel(self.selectionModel) #table.setColumnWidth(0,100) self.setCentralWidget(splitter) self.table.doubleClicked.connect(self.ClickAction_table) def readDB(self): con = sqlite3.connect("mystudy.db") cur = con.cursor() cur.execute("select subject, readcheck from study;") self.model.removeRows(0, self.model.rowCount(QModelIndex()), QModelIndex()) self.model2.removeRows(0, self.model2.rowCount(QModelIndex()), QModelIndex()) row = 0 for line in cur: if line[1] == 1: result = "○" else: result = "X" self.model.insertRows(row, 1, QModelIndex()) self.model.setData(self.model.index(row, 0, QModelIndex()), line[0]) self.model.setData(self.model.index(row, 1, QModelIndex()), result) self.model.setData(self.model.index(row, 1, QModelIndex()), QVariant(Qt.AlignCenter), Qt.TextAlignmentRole) row += 1 cur.execute("select count() from study ;") for line in cur: self.studyTotal = line[0] cur.execute("select count() from study where readcheck=1;") for line in cur: self.studyRead = line[0] #print("총 개수 " ,self.studyTotal ," 학습한개수", self.studyRead ) con.close() row = 0 self.model2.insertRows(row, 1, QModelIndex()) self.model2.setData(self.model2.index(row, 0, QModelIndex()), "학습") self.model2.setData(self.model2.index(row, 1, QModelIndex()), float(self.studyRead)) self.model2.setData(self.model2.index(row, 0, QModelIndex()), QColor("#99e600"), Qt.DecorationRole) row = 1 self.model2.insertRows(row, 1, QModelIndex()) self.model2.setData(self.model2.index(row, 0, QModelIndex()), "미학습") self.model2.setData(self.model2.index(row, 1, QModelIndex()), float(self.studyTotal - self.studyRead)) self.model2.setData(self.model2.index(row, 0, QModelIndex()), QColor("#8080b3"), Qt.DecorationRole) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setSelectionMode(QAbstractItemView.SingleSelection) self.table.setDragEnabled(False) self.table.horizontalHeader().setStretchLastSection(True) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.table.resizeRowsToContents() self.table.resizeColumnsToContents() self.table.setColumnWidth(0, 350) #self.statusBar().showMessage("Loaded %s" % path, 2000) def ClickAction_table(self, index): #self.system #index.data() #self.table.selectedIndexes()[0].data() tempstr = self.table.selectedIndexes()[0].data().split() filepath = r"PyStudy_web\\example\\기본예제\\" + tempstr[0] + ".html" selectedRowKey = self.table.selectedIndexes()[0].row( ) + 1 #mysql 테이블 줄수 차이 #print("click test ",selectedRowKey ) con = sqlite3.connect("mystudy.db") cur = con.cursor() cur.execute("update 'study' set 'readcheck'=1 where key=" + str(selectedRowKey) + ";") con.commit() con.close() self.setupViews() self.readDB() self.system.sendMessage("/학습창 열기 " + filepath) def ClickAction_dbinit(self, index): con = sqlite3.connect("mystudy.db") cur = con.cursor() cur.execute("update 'study' set 'readcheck'=0 ;") con.commit() con.close() self.setupViews() self.readDB()
editor.setValue(value) def setModelData(self, editor, model, index): value = editor.value() model.setData(index, value, Qt.EditRole) def updateEditorGeometry(self, editor, option, index): editor.setGeometry(option.rect) if __name__ == '__main__': app = QApplication(sys.argv) data = MyData() table_view = QTableView() my_model = MyModel(data) table_view.setModel(my_model) delegate = MyDelegate() table_view.setItemDelegate(delegate) table_view.show() # The mainloop of the application. The event handling starts from this point. # The exec_() method has an underscore. It is because the exec is a Python keyword. And thus, exec_() was used instead. exit_code = app.exec_() # The sys.exit() method ensures a clean exit. # The environment will be informed, how the application ended. sys.exit(exit_code)
def __getTopRow(self, tableView: QTableView) -> DictTableRow: model = tableView.model() if model.rowCount() > 0: index = model.index(0, 0) return model.itemFromIndex(index).dictTableRow() return None
self._data = data def rowCount(self, parent=None): return self._data.shape[0] def columnCount(self, parnet=None): return self._data.shape[1] def data(self, index, role=Qt.DisplayRole): if index.isValid(): if role == Qt.DisplayRole: return str(self._data.iloc[index.row(), index.column()]) return None def headerData(self, col, orientation, role): if orientation == Qt.Horizontal and role == Qt.DisplayRole: return self._data.columns[col] return None if __name__ == '__main__': app = QApplication(sys.argv) model = pandasModel(df) view = QTableView() view.setModel(model) view.resize(800, 600) df = df.append(pd.Series([2.3,596,99],name="d")) model = pandasModel(df) view = QTableView() view.setModel(model) view.show() sys.exit(app.exec_())
class Widget(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setGeometry(100, 150, 1200, 600) self.Columns = '*' self.font = None self.HeaderList = None self.left_padding = 0 self.right_padding = 0 self.search_field_spacing = 5 self.createDB() self.getHeaders() layout = QVBoxLayout(self) buttons_layout = QHBoxLayout() show_plant_view = QPushButton('Plant photo with details') font_button = QPushButton('Font') buttons_layout.addWidget(show_plant_view) buttons_layout.addWidget(font_button) layout.addLayout(buttons_layout) show_plant_view.clicked.connect(self._show_photo_view) font_button.clicked.connect(self.font_dialog) self.model = MySqlModel(self.HeaderList) self.SearchQuery = "select {} from {}".format(self.Columns, _DB_TABLE) self.model.setQuery(self.SearchQuery, self.DB) self.view = QTableView(self) self.view.setMinimumHeight(325) self.font = self.view.property('font') self.view.setModel(self.model) self.view.setColumnHidden(self.model.image_column, True) self.view.setColumnHidden(self.model.info_column, True) horizontal_header = self.view.horizontalHeader() for i in range(len(horizontal_header)): horizontal_header.setSectionResizeMode(i, QHeaderView.Stretch) self.search_layout = QHBoxLayout() self.search_layout.insertSpacing(0, self.left_padding) self.SearchFieldsGrid = QGridLayout() self.makeSearchFieldsGrid() self.search_layout.addLayout(self.SearchFieldsGrid) self.search_layout.insertSpacing(-1, self.right_padding) layout.addLayout(self.search_layout) #self.view.horizontalHeader().setStretchLastSection(True) #self.view.resizeColumnsToContents() #self.view.horizontalHeader().ResizeMode(QHeaderView.Interactive) layout.addWidget(self.view) self.view.resizeRowsToContents() self.view_vertical_header = self.view.verticalHeader() self.view_vertical_header.geometriesChanged.connect( self._align_search_layout) def createDB(self): # binding to an existing database self.DB = QtSql.QSqlDatabase.addDatabase('QSQLITE') self.DB.setDatabaseName(_PATH_TO_DB) self.DB.open() def getHeaders(self): # getting a list of Headers self.query = QtSql.QSqlQuery(db=self.DB) self.query.exec_("PRAGMA table_info({})".format(_DB_TABLE)) # filling the list of headings self.HeaderList = [] while self.query.next(): self.HeaderList.append(self.query.value(1)) # create a query parameter dictionary self.paramsDict = {x: ['', '', ''] for x in self.HeaderList} self.paramsDict[''] = ["{} {} '%{}%'", '', ''] def makeSearchFieldsGrid(self): self.SearchFieldsGrid.setSpacing(self.search_field_spacing) self.clearLayout(self.SearchFieldsGrid) self.cb = QCheckBox(self) self.cb.stateChanged.connect(self.changeQuery) self.SearchFieldsGrid.addWidget(self.cb, 1, 0) n = len(self.HeaderList) qwidth = [self.view.columnWidth(i) for i in range(n)] self.qles = [None for i in range(n)] for i in range(n): self.qles[i] = QLineEdit(self) self.qles[i].setObjectName(self.HeaderList[i]) self.qles[i].textChanged[str].connect(self.setSearchQuery) label = QLabel(self.HeaderList[i]) self.SearchFieldsGrid.addWidget(label, 0, i + 1, alignment=Qt.AlignCenter) self.SearchFieldsGrid.addWidget(self.qles[i], 1, i + 1) def clearLayout(self, layout): while layout.count(): child = layout.takeAt(0) if child.widget() is not None: child.widget().deleteLater() elif child.layout() is not None: clearLayout(child.layout()) # remembering the status of the switch after pressing and updating the table def changeQuery(self, state): self.state = state self.setSearchQuery('') def setSearchQuery(self, text): # switch handling try: if self.state == Qt.Checked: self.paramsDict[''] = [ "{0} {1} '% {2}%' or {0} {1} '{2}%'", '', '' ] else: self.paramsDict[''] = ["{} {} '%{}%'", '', ''] except: self.paramsDict[''] = ["{} {} '%{}%'", '', ''] # processing of more and less characters if text != '': if text[0] == '<': matching = '<' queryString = "{} {} {}" text = text[1:] elif text[0] == '>': matching = '>' queryString = "{} {} {}" text = text[1:] else: queryString = self.paramsDict[''][0] matching = 'like' else: queryString, matching, text = self.paramsDict[''] # filling in the query parameters dictionary self.paramsDict[self.sender().objectName()] = [ queryString, matching, text ] paramList = [] # assembling query parameters into a list for name, value in self.paramsDict.items(): if len(value) == 3: queryString, matching, text = value if queryString.find('%') != -1: queryString = self.paramsDict[''][0] if text != '': paramList.append(queryString.format(name, matching, text)) # assembling query parameters into a string if len(paramList) == 0: params = '' elif len(paramList) == 1: params = 'where {}'.format(paramList[0]) else: params = 'where {}'.format(" and ".join(paramList)) # assembling the query and updating the table according to it self.Columns = '*' if self.Columns == '' else self.Columns self.searchQuery = "select {} from {} {}".format( self.Columns, _DB_TABLE, params) self.model.setQuery(self.searchQuery, self.DB) self.view.resizeRowsToContents() #header = self.view.horizontalHeader() #for i in range(len(header)): #header.setSectionResizeMode(i, QHeaderView.Stretch) def font_dialog(self): self.font, valid = QFontDialog.getFont(self.font) if valid: self.view.setFont(self.font) self.view.resizeRowsToContents() for i in self.qles: i.setFont(self.font) def _align_search_layout(self): vertical_header_width = self.view_vertical_header.width() checkbox_width = self.cb.width() self.left_padding = vertical_header_width - checkbox_width - self.search_field_spacing vertical_scrollbar_width = self.view.verticalScrollBar().width() self.right_padding = vertical_scrollbar_width left_spacer = self.search_layout.itemAt(0) left_spacer.changeSize(self.left_padding, 10) right_spacer = self.search_layout.itemAt(2) right_spacer.changeSize(self.right_padding, 10) self.search_layout.invalidate() def _show_photo_view(self): #image_data = _get_image_paths_names(self.model) viewer = PhotoViewe(self.model, self) viewer.show()
def __init__(self, parent=None): QWidget.__init__(self, parent) self.setGeometry(100, 150, 1200, 600) self.Columns = '*' self.font = None self.HeaderList = None self.left_padding = 0 self.right_padding = 0 self.search_field_spacing = 5 self.createDB() self.getHeaders() layout = QVBoxLayout(self) buttons_layout = QHBoxLayout() show_plant_view = QPushButton('Plant photo with details') font_button = QPushButton('Font') buttons_layout.addWidget(show_plant_view) buttons_layout.addWidget(font_button) layout.addLayout(buttons_layout) show_plant_view.clicked.connect(self._show_photo_view) font_button.clicked.connect(self.font_dialog) self.model = MySqlModel(self.HeaderList) self.SearchQuery = "select {} from {}".format(self.Columns, _DB_TABLE) self.model.setQuery(self.SearchQuery, self.DB) self.view = QTableView(self) self.view.setMinimumHeight(325) self.font = self.view.property('font') self.view.setModel(self.model) self.view.setColumnHidden(self.model.image_column, True) self.view.setColumnHidden(self.model.info_column, True) horizontal_header = self.view.horizontalHeader() for i in range(len(horizontal_header)): horizontal_header.setSectionResizeMode(i, QHeaderView.Stretch) self.search_layout = QHBoxLayout() self.search_layout.insertSpacing(0, self.left_padding) self.SearchFieldsGrid = QGridLayout() self.makeSearchFieldsGrid() self.search_layout.addLayout(self.SearchFieldsGrid) self.search_layout.insertSpacing(-1, self.right_padding) layout.addLayout(self.search_layout) #self.view.horizontalHeader().setStretchLastSection(True) #self.view.resizeColumnsToContents() #self.view.horizontalHeader().ResizeMode(QHeaderView.Interactive) layout.addWidget(self.view) self.view.resizeRowsToContents() self.view_vertical_header = self.view.verticalHeader() self.view_vertical_header.geometriesChanged.connect( self._align_search_layout)
def __init__(self, data_list, header, *args): QWidget.__init__( self, *args, ) self.setGeometry(100, 50, 1800, 900) self.setWindowTitle('Artikelen bestellijst') self.setWindowIcon(QIcon('./images/logos/logo.jpg')) self.setWindowFlags(self.windowFlags() | Qt.WindowSystemMenuHint | Qt.WindowMinMaxButtonsHint) table_model = MyTableModel(self, data_list, header) table_view = QTableView() table_view.setModel(table_model) font = QFont("Arial", 10) table_view.setFont(font) table_view.resizeColumnsToContents() table_view.setSelectionBehavior(QTableView.SelectRows) table_view.setItemDelegateForColumn(10, showImage(self)) table_view.setColumnWidth(10, 100) table_view.verticalHeader().setDefaultSectionSize(75) table_view.clicked.connect(showArtikel) layout = QVBoxLayout(self) layout.addWidget(table_view) self.setLayout(layout)
def __init__(self,parent=None): QWidget.__init__(self,parent) self.setWindowTitle('View') dirModel=QDirModel() lay=QGridLayout(self) lv=QListView() lay.addWidget(lv,0,0) lv.setModel(dirModel) lvi=QListView() lay.addWidget(lvi,0,1) lvi.setViewMode(QListView.IconMode) lvi.setModel(dirModel) trv=QTreeView() lay.addWidget(trv,1,0) trv.setModel(dirModel) tav=QTableView() tav.setModel(dirModel) lay.addWidget(tav,1,1) cwdIndex=dirModel.index(QDir.currentPath()) lv.setRootIndex(cwdIndex) lvi.setRootIndex(cwdIndex) trv.setRootIndex(cwdIndex) tav.setRootIndex(cwdIndex)
def createView(title, model): global offset, views view = QTableView() views.append(view) view.setModel(model) view.setWindowTitle(title) view.move(100 + offset, 100 + offset) offset += 20 view.show()
def initUI(self): self.resize(800, 600) centralWidget = QWidget(self) grid = QGridLayout(centralWidget) grid.setSpacing(10) self.listOfDiscipline = QComboBox(centralWidget) grid.addWidget(self.listOfDiscipline, 0, 0, 1, 1) textIn = QLabel(centralWidget) textIn.setText('Входные компетенции') grid.addWidget(textIn, 1, 0, 1, 1) self.tableIn = QTableView(centralWidget) grid.addWidget(self.tableIn, 2, 0, 1, 1) textOut = QLabel(centralWidget) textOut.setText('Выходные компетенции') grid.addWidget(textOut, 3, 0, 1, 1) self.tableOut = QTableView(centralWidget) grid.addWidget(self.tableOut, 4, 0, 1, 1) self.setCentralWidget(centralWidget) openFile = QAction('Открыть базу данных', self) openFile.setShortcut('Ctrl+O') openFile.setStatusTip('Открыть базу данных комптенций') openFile.triggered.connect(self.MainFunc) exitWindow = QAction('Выход', self) exitWindow.setStatusTip('Завершение программы') exitWindow.triggered.connect(self.close) saveFile_one = QAction('Сохранить дисциплину', self) saveFile_one.setShortcut('Ctrl+S') saveFile_one.setStatusTip('Сохранить одну дисциплину в формате xlsx') saveFile_one.triggered.connect(self.save_one) saveFile_all = QAction('Сохранить все дисциплины', self) saveFile_all.setShortcut('Ctrl+A') saveFile_all.setStatusTip('Сохранить все дисциплины в формате xlsx') saveFile_all.triggered.connect(self.save_all) menubar = self.menuBar() fileMenu = menubar.addMenu('&Файл') fileMenu.addAction(openFile) fileSaveMenu = fileMenu.addMenu('&Дисциплины') fileSaveMenu.addAction(saveFile_one) fileSaveMenu.addAction(saveFile_all) fileMenu.addAction(fileSaveMenu.menuAction()) fileMenu.addSeparator() fileMenu.addAction(exitWindow) self.nameFileOpen = '' self.statusBar() self.setWindowTitle('Формирование компетенций') self.show()