Поскольку вы уже находитесь на земле Qt, вы можете сделать что-то вроде этого:
from PyQt4.QtCore import QProcess
class YourClass(QObject):
[...]
def videoProcess(self):
self.pushButton.setEnabled(0)
self.pushButton.setText("Please Wait")
command = "handbrake.exe"
args = ["-i", "somefile.wmv", "-o", "somefile.mp4"]
process = QProcess(self)
process.finished.connect(self.onFinished)
process.startDetached(command, args)
def onFinished(self, exitCode, exitStatus):
self.pushButton.setEnabled(True)
[...]
мне была нужна эта функциональность для EditText
с многострочной поддержкой в моем приложении примечаний. Я хотел курсор в конце текста, когда пользователь перешел к фрагменту, который имеет текст примечания.
решение, предложенное , djleop приближается. Но проблема с этим состоит в том, что, если бы пользователь помещает курсор где-нибудь посреди текста для редактирования и начинает вводить, курсор перешел бы до конца текста снова. Это произошло, потому что эти LiveData
испустит новое значение, и курсор перешел бы до конца текста, снова приводящего к пользователю, который не в состоянии отредактировать текст где-нибудь в середине.
Для решения этого я использую MediatorLiveData
и присваиваю ему длину String
только однажды использование флага. Это заставит LiveData читать значение только однажды, то есть, когда пользователь перейдет к фрагменту. После этого пользователь может установить курсор где угодно, они хотят отредактировать текст там.
ViewModel
private var accessedPosition: Boolean = false
val cursorPosition = MediatorLiveData<Event<Int>>().apply {
addSource(yourObject) { value ->
if(!accessedPosition) {
setValue(Event(yourObject.note.length))
accessedPosition = true
}
}
}
Здесь, yourObject
является другой LiveData, полученный от базы данных, которая содержит Строковый текст, который Вы отображаете в EditText
.
Тогда связывают это MediatorLiveData
с Вашим использованием EditText обязательный адаптер.
Использование XML
двухсторонняя привязка данных для отображения текста, а также принятия ввода текста.
<!-- android:text must be placed before cursorPosition otherwise we'll get IndexOutOfBounds exception-->
<EditText
android:text="@={viewModel.noteText}"
cursorPosition="@{viewModel.cursorPosition}" />
Обязательный Адаптер
@BindingAdapter("cursorPosition")
fun bindCursorPosition(editText: EditText, event: Event<Int>?) {
event?.getContentIfNotHandled()?.let { editText.setSelection(it) }
}
Event
класс
Event
класс здесь похож SingleLiveEvent, записанный Jose AlcГ©rreca из Google. Я использую его здесь для заботы об экранном вращении. Используя сингл Event
удостоверится, что курсор не перейдет до конца текста, когда пользователь отредактирует текст где-нибудь в середине, и экран вращается. Это сохранит ту же позицию, когда экран будет вращаться.
Вот Event
класс:
open class Event<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}
Это - решение, которое работает на меня и обеспечивает хороший пользовательский опыт. Надежда это помогает в Ваших проектах также.