Создание панели активных файлов в Qt-Designer
Не давно начал изучать PyQt при написание программы и столкнулся с вопросом:
Как сделать список активных файлов или проектов?
Когда вы открываете PyCharm, Sublime Text или даже Блокнот, то сверху можно увидеть список файлов, которые сейчас открыты для работы.
Можно ли реализовать такое с помощью PyQt и если можно, то как?
Такой виджет должен открываться, закрываться и отображать какие-либо элементы программы внутри себя
UPD:
Что есть на данный момент:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<author>Dynamic Software, Dynamic Aerospace</author>
<class>IIC</class>
<widget class="QMainWindow" name="IIC">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>480</height>
</rect>
</property>
<property name="windowTitle">
<string>IIC - (демо версия)</string>
</property>
<widget class="QWidget" name="centralwidget"/>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>22</height>
</rect>
</property>
<widget class="QMenu" name="File">
<property name="title">
<string>Файл</string>
</property>
<addaction name="New"/>
<addaction name="Open"/>
<addaction name="RecentFile"/>
<addaction name="separator"/>
<addaction name="Close"/>
<addaction name="CloseAll"/>
<addaction name="separator"/>
<addaction name="Save"/>
<addaction name="SaveAs"/>
<addaction name="Export"/>
<addaction name="separator"/>
<addaction name="Preview"/>
<addaction name="Print"/>
<addaction name="separator"/>
<addaction name="Send"/>
<addaction name="separator"/>
<addaction name="InformationDocument"/>
<addaction name="separator"/>
<addaction name="Exit"/>
</widget>
<widget class="QMenu" name="Edit">
<property name="title">
<string>Правка</string>
</property>
<addaction name="Undo"/>
<addaction name="Redo"/>
<addaction name="separator"/>
<addaction name="RepeatLastCommand"/>
<addaction name="separator"/>
<addaction name="Cut"/>
<addaction name="Copy"/>
<addaction name="Paste"/>
<addaction name="Delete"/>
<addaction name="separator"/>
<addaction name="Scale"/>
</widget>
<widget class="QMenu" name="Settings">
<property name="title">
<string>Настройки</string>
</property>
<addaction name="RestoreLicenses"/>
<addaction name="ReceiveLicensesIIC"/>
<addaction name="separator"/>
<addaction name="Parameters"/>
<addaction name="LoadParameters"/>
<addaction name="SaveParameters"/>
</widget>
<widget class="QMenu" name="Apps">
<property name="title">
<string>Приложения</string>
</property>
<addaction name="AddApps"/>
<addaction name="Configurator"/>
</widget>
<widget class="QMenu" name="Window">
<property name="title">
<string>Окно</string>
</property>
<addaction name="CloseCurrentWindow"/>
</widget>
<widget class="QMenu" name="Help">
<property name="title">
<string>Справка</string>
</property>
<addaction name="Content"/>
<addaction name="separator"/>
<addaction name="TrainingMaterials"/>
<addaction name="separator"/>
<addaction name="IICOnInternet"/>
<addaction name="separator"/>
<addaction name="LicenseAgreement"/>
<addaction name="AboutProgram"/>
</widget>
<widget class="QMenu" name="Decoration">
<property name="title">
<string>Оформление</string>
</property>
<addaction name="StyleLibrary"/>
<addaction name="separator"/>
<addaction name="CreateReport"/>
<addaction name="EditTemplateReport"/>
<addaction name="CreateTemplateReport"/>
</widget>
<widget class="QMenu" name="Analysis">
<property name="title">
<string>Анализ</string>
</property>
<addaction name="AnalysisInjector"/>
<addaction name="OptimizationInjector"/>
<addaction name="separator"/>
<addaction name="CustomExpressions"/>
</widget>
<addaction name="File"/>
<addaction name="Edit"/>
<addaction name="Analysis"/>
<addaction name="Decoration"/>
<addaction name="Settings"/>
<addaction name="Apps"/>
<addaction name="Window"/>
<addaction name="Help"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="New">
<property name="text">
<string>Новый</string>
</property>
</action>
<action name="Open">
<property name="text">
<string>Открыть</string>
</property>
</action>
<action name="RecentFile">
<property name="text">
<string>Последние файлы</string>
</property>
</action>
<action name="Save">
<property name="text">
<string>Сохранить</string>
</property>
</action>
<action name="SaveAs">
<property name="text">
<string>Сохранить как</string>
</property>
</action>
<action name="action_PDF">
<property name="text">
<string>.PDF</string>
</property>
</action>
<action name="action_TXT">
<property name="text">
<string>.TXT</string>
</property>
</action>
<action name="Export">
<property name="text">
<string>Экспортировать</string>
</property>
</action>
<action name="Print">
<property name="text">
<string>Печать</string>
</property>
</action>
<action name="Exit">
<property name="text">
<string>Выход</string>
</property>
</action>
<action name="Undo">
<property name="text">
<string>Отменить</string>
</property>
</action>
<action name="Redo">
<property name="text">
<string>Повторить</string>
</property>
</action>
<action name="Cut">
<property name="text">
<string>Вырезать</string>
</property>
</action>
<action name="Copy">
<property name="text">
<string>Копировать</string>
</property>
</action>
<action name="Paste">
<property name="text">
<string>Вставить</string>
</property>
</action>
<action name="action_6">
<property name="text">
<string>Дублировать</string>
</property>
</action>
<action name="Delete">
<property name="text">
<string>Удалить</string>
</property>
</action>
<action name="Scale">
<property name="text">
<string>Масштабировать</string>
</property>
</action>
<action name="RestoreLicenses">
<property name="text">
<string>Восстановить лицензии</string>
</property>
</action>
<action name="ReceiveLicensesIIC">
<property name="text">
<string>Получить лицензию на IIC</string>
</property>
</action>
<action name="Parameters">
<property name="text">
<string>Параметры</string>
</property>
</action>
<action name="LoadParameters">
<property name="text">
<string>Загрузить параметры</string>
</property>
</action>
<action name="SaveParameters">
<property name="text">
<string>Сохранить параметры</string>
</property>
</action>
<action name="AddApps">
<property name="text">
<string>Добавить приложение</string>
</property>
</action>
<action name="Configurator">
<property name="text">
<string>Конфигуратор</string>
</property>
</action>
<action name="CloseCurrentWindow">
<property name="text">
<string>Закрыть текущую вкладку</string>
</property>
</action>
<action name="Content">
<property name="text">
<string>Содержание</string>
</property>
</action>
<action name="TrainingMaterials">
<property name="text">
<string>Обучающие материалы</string>
</property>
</action>
<action name="IICOnInternet">
<property name="text">
<string>IIC в интернете</string>
</property>
</action>
<action name="LicenseAgreement">
<property name="text">
<string>Лицензионное соглашение</string>
</property>
</action>
<action name="AboutProgram">
<property name="text">
<string>О программе</string>
</property>
</action>
<action name="InformationDocument">
<property name="text">
<string>Информация о документе</string>
</property>
</action>
<action name="Send">
<property name="text">
<string>Отправить</string>
</property>
</action>
<action name="Close">
<property name="text">
<string>Закрыть</string>
</property>
</action>
<action name="CloseAll">
<property name="text">
<string>Закрыть все документы</string>
</property>
</action>
<action name="Preview">
<property name="text">
<string>Предварительный просмотр</string>
</property>
</action>
<action name="RepeatLastCommand">
<property name="text">
<string>Повторить последнюю команду</string>
</property>
</action>
<action name="StyleLibrary">
<property name="text">
<string>Библиотека стилей</string>
</property>
</action>
<action name="CreateReport">
<property name="text">
<string>Создать отчет</string>
</property>
</action>
<action name="EditTemplateReport">
<property name="text">
<string>Редактировать шаблон отчета</string>
</property>
</action>
<action name="CreateTemplateReport">
<property name="text">
<string>Создать шаблон отчета</string>
</property>
</action>
<action name="AnalysisInjector">
<property name="text">
<string>Анализ форсунки</string>
</property>
</action>
<action name="OptimizationInjector">
<property name="text">
<string>Оптимизация форсунки</string>
</property>
</action>
<action name="CustomExpressions">
<property name="text">
<string>Пользовательские выражения</string>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>
Скриншот для наглядности:
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Не очень уверен что правильно понял вас, но попробуйте проверить возможный вариант:
Конвертируем вашу форму .ui в .py:
pyuic5 q1592407.ui -o q1592407_ui.py -x
Выполнить main.py:
.
import sys
from PyQt5.Qt import *
from q1592407_ui import Ui_IIC
lineBarColor = QColor(53, 53, 53)
lineHighlightColor = QColor('#00FF04')
class NumberBar(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.editor = parent
layout = QVBoxLayout(self)
self.editor.blockCountChanged.connect(self.update_width)
self.editor.updateRequest.connect(self.update_on_scroll)
self.update_width('001')
def mousePressEvent(self, QMouseEvent):
print("\n - class NumberBar(): \n\tdef mousePressEvent():")
def update_on_scroll(self, rect, scroll):
if self.isVisible():
if scroll:
self.scroll(0, scroll)
else:
self.update()
def update_width(self, string):
width = self.fontMetrics().width(str(string)) + 10
if self.width() != width:
self.setFixedWidth(width)
def paintEvent(self, event):
if self.isVisible():
block = self.editor.firstVisibleBlock()
height = self.fontMetrics().height()
number = block.blockNumber()
painter = QPainter(self)
painter.fillRect(event.rect(), lineBarColor)
painter.setPen(Qt.white)
painter.drawRect(
0, 0,
event.rect().width() - 1,
event.rect().height() - 1)
font = painter.font()
current_block = self.editor.textCursor().block().blockNumber() + 1
while block.isValid():
block_geometry = self.editor.blockBoundingGeometry(block)
offset = self.editor.contentOffset()
block_top = block_geometry.translated(offset).top()
number += 1
rect = QRect(0, block_top, self.width() - 5, height)
if number == current_block:
font.setBold(True)
else:
font.setBold(False)
painter.setFont(font)
painter.drawText(rect, Qt.AlignRight, '%i' % number)
if block_top > event.rect().bottom():
break
block = block.next()
painter.end()
class Content(QWidget):
def __init__(self, text):
super(Content, self).__init__()
self.editor = QPlainTextEdit()
self.editor.setPlainText(text)
self.hbox = QHBoxLayout(self)
self.numbers = NumberBar(self.editor)
self.hbox.addWidget(self.numbers)
self.hbox.addWidget(self.editor)
class TabWidget(QTabWidget):
def __init__(self, parent=None):
super(TabWidget, self).__init__(parent)
def tabRemoved(self, index):
print(f"\n вкладка удалена из индекса позиции -> {index}")
def tabInserted(self, index):
print(f"\n Новая вкладка была добавлена или вставлена "
f"в индекс позиции -> {index}")
class MyTableWidget(QWidget):
def __init__(self, parent=None):
super(QWidget, self).__init__(parent)
self.layout = QVBoxLayout(self)
# Initialize tab screen
self.tabs = TabWidget()
self.tabs.resize(300, 200)
# Add tabs
self.tabs.setTabsClosable(True)
self.tabs.tabCloseRequested.connect(self.closeTab)
# Add tabs to widget
self.layout.addWidget(self.tabs)
self.setLayout(self.layout)
def closeTab(self, index):
tab = self.tabs.widget(index)
tab.deleteLater()
self.tabs.removeTab(index)
def addtab(self, content, fileName):
self.tabs.addTab(Content(str(content)), str(fileName))
class MainWindow(QMainWindow, Ui_IIC):
def __init__(self):
super().__init__()
self.setupUi(self)
self.tabs = MyTableWidget()
self.layout = QVBoxLayout(self.centralwidget)
self.layout.addWidget(self.tabs)
self.Open.triggered.connect(self.openFile)
self.New.triggered.connect(self.new)
def new(self):
self.tabs.addtab('', 'new_file_name.txt')
def openFile(self):
options = QFileDialog.Options()
filenames, _ = QFileDialog.getOpenFileNames(
self, 'Open a file', '',
'Python Files (*.py);;Text Files (*.txt)',
options=options
)
if filenames:
for filename in filenames:
with open(filename, 'r+') as file_o:
try:
text = file_o.read()
self.tabs.addtab(text, filename)
except Exception as e:
print("Error: filename=`{}`, `{}` ".format( filename, str(e)))
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec())