В старом ответе объясните в разделе «Передача ссылок на QML» , как обновить некоторый объект python из QML, эта методика рекомендована Qt, и именно она следует использовать сейчас. С вашим текущим методом вам нужно установить имя объекта, которое может быть проблематичным во многих случаях.
Таким образом, решение состоит в том, чтобы создать объект QObject, который мы экспортируем в QML, и обновить свойство qproperty, при этом он выдаст сигнал, который мы подключаем к слоту, в котором мы можем выполнить необходимую логику. С другой стороны, FileDialog возвращает URL, поэтому свойство должно быть QUrl:
main.qml
import os
import sys
from PySide2 import QtCore, QtGui, QtQml
class FileManager(QtCore.QObject):
file_url_Changed = QtCore.Signal(QtCore.QUrl)
def __init__(self, parent=None):
super(FileManager, self).__init__(parent)
self._file_url = QtCore.QUrl()
def get_file_url(self):
return self._file_url
def set_file_url(self, file_url):
if self._file_url != file_url:
self._file_url = file_url
self.file_url_Changed.emit(self._file_url)
file_url = QtCore.Property(QtCore.QUrl, fget=get_file_url, fset=set_file_url, notify=file_url_Changed)
@QtCore.Slot(QtCore.QUrl)
def on_file_url_changed(file_url):
print(file_url.toLocalFile())
if __name__ == '__main__':
sys.argv += ['--style', 'material']
app = QtGui.QGuiApplication(sys.argv)
file_manager = FileManager()
file_manager.file_url_Changed.connect(on_file_url_changed)
engine = QtQml.QQmlApplicationEngine()
engine.rootContext().setContextProperty("file_manager", file_manager)
file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "QML", "main.qml")
engine.load(QtCore.QUrl.fromLocalFile(file))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
Page1.qml
import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick.Dialogs 1.2
Page {
width: 600
height: 400
header: Label {
text: qsTr("Prepare Data")
horizontalAlignment: Text.AlignHCenter
font.pixelSize: Qt.application.font.pixelSize * 2
padding: 10
}
Button {
text: qsTr("Load data")
anchors.centerIn: parent
onClicked: fileDialog.visible = true
padding: 10
}
FileDialog {
id: fileDialog
selectFolder: true
title: qsTr("Select the data directory")
folder: shortcuts.home
onAccepted: {
file_manager.file_url = fileDialog.fileUrl // <---
}
}
}
Perl. Серьезно, это делает материал системного администратора настолько легче. Вот пример:
perl -pi -e 's/something/somethingelse/g' *.log
jEdit regex search& замена в файлах довольно достойна. Немного излишество, если Вы только используете его для этого, все же. Это также не поддерживает multi-expression-replace, который Вы попросили.
Vim для спасения (и президент;-)). Попробуйте:
vim -c "argdo! s:foo:bar:gci" <list_of_files>
(я действительно люблю переключатель-c Vim, это волшебно. Или если Вы уже имели в Vim и открыли файлы, например:
vim <list_of_files>
Просто проблема:
:bufdo! s:foo:bar:gci
, Конечно sed
и perl
способно также. HTH.
Для находят и заменяют на нескольких файлах в Windows I, найденном rxFind, чтобы быть очень полезным.
В соответствии с Windows, я раньше любил WinGrep
Под Ubuntu, я использую Regexxer.
У редактора каталога Emacs есть функция 'dired-do-query-replace-regexp', чтобы искать и заменить regexp по ряду отмеченных файлов.
Неудивительно, Perl делает прекрасное задание обработки этого, в сочетании с достойной оболочкой:
for file in @filelist ; do
perl -p -i -e "s/pattern/result/g" $file
done
Это имеет тот же эффект (но более эффективно, и без состояния состязания), как:
for file in @filelist ; do
cat $file | sed "s/pattern/result/" > /tmp/newfile
mv /tmp/newfile $file
done
Textpad делает хорошее задание его в Windows. И это - очень хороший редактор также.
sed быстр и легок:
sed -e "s/pattern/result/" <file list>
можно также присоединиться к нему с находкой:
find <other find args> -exec sed -e "s/pattern/result/" "{}" ";"
Я нашел полезный инструмент RxFind (бесплатный OSS).
Мне больше всего нравится PowerGrep от JGSoft. Он взаимодействует с RegexBuddy , который может помочь вам создать и протестировать регулярное выражение, автоматически создает резервные копии всех изменений (и предоставляет возможности отмены), предоставляет возможность анализировать несколько каталогов (с шаблонами имен файлов) и даже поддерживает такие форматы файлов, как Microsoft Word, Excel и PDF.
У меня роскошь Unix и Ubuntu; В обоих случаях я использую gawk для всего, что требует построчного поиска и замены, особенно для построчного поиска подстрок. В последнее время это был самый быстрый способ обработки 1100 изменений против миллионов строк в сотнях файлов (один каталог). В Ubuntu я являюсь поклонником regexxer
sudo apt-get install regexxer