QML self.emit 启动函数以打开弹出窗口。不起作用[关闭]
Posted
技术标签:
【中文标题】QML self.emit 启动函数以打开弹出窗口。不起作用[关闭]【英文标题】:QML self.emit to start function to open popup. Does not work [closed] 【发布时间】:2021-10-25 12:56:54 【问题描述】:所以我制作了一个可以正常工作的弹出窗口。但现在我需要该函数等到弹出窗口被填充。所以我开始了一个循环,直到 if 语句!=“空”。但不知何故,弹出窗口不起作用。 QML 正在获取应该启动弹出窗口但它没有打开的变量。当 while 循环中断或结束时,它会启动弹出窗口。
Main.qml
ApplicationWindow
property var openpopup: "" // this prints yes when console.log()
// connectie met de backend van python
Connections
target: backend
function onPopupemail(variable)
popupemail = variable
Start_popup.qml
Button
onClicked:
backend.sendQuery() // this starts the sendQuery function
if(openpopup == "yes")
popup.open()
Popup
id: popup
Button
onClicked:
popup.close()
backend.updateklantnaam(popupemail.text, klantnieuw.text)
// starts updateklantnaam
Funcy.py
global pauseloop, thread_popupemail, thread_popupname
pauseloop = False
thread_popupemail = ""
thread_popupname = ""
def sendQuery (self)
openpopup = "yes"
self.openpopup.emit(openpopup)
global pauseloop, thread_popupname, thread_popupemail
pauseloop = True
while pauseloop == True:
time.sleep(2)
if thread_popupemail != "" and thread_popupname != "":
cursor.execute "INSERT INTO " #insert query
conn.commit()
thread_popupemail = ""
thread_popupname = ""
pauseloop = False
break
print("break loop")
@pyqtSlot(str, str)
def updateklantnaam (self, popupemail, popupname):
global thread_popupname, thread_popupemail
thread_popupemail = popupemail
thread_popupname = popupname
【问题讨论】:
请提供minimal reproducible example @eyllanesc 只是想知道您还需要什么才能找到问题?据我所知,我已经添加了您应该需要的所有内容。 我们需要一个 MRE,一个包含重现错误所需行的代码,而您提供的代码片段是不够的。请阅读链接。另请阅读How to Ask 【参考方案1】:您的弹出窗口没有打开的原因是sendQuery
在退出 while 循环之前永远不会返回。您正在使用无限循环阻塞主 UI 线程。当 QML 调用后端时,后端应该尽快返回。如果它需要等待某些东西,它应该在一个单独的线程中完成。
但在您的示例中,我什至根本看不到 while 循环的意义。我会将您的 if
语句移动到 updateklantnaam
函数中,因此根本无需等待。
def sendQuery (self)
openpopup = "yes"
self.openpopup.emit(openpopup)
@pyqtSlot(str, str)
def updateklantnaam (self, popupemail, popupname):
global thread_popupname, thread_popupemail
thread_popupemail = popupemail
thread_popupname = popupname
if thread_popupemail != "" and thread_popupname != "":
cursor.execute "INSERT INTO " #insert query
conn.commit()
thread_popupemail = ""
thread_popupname = ""
【讨论】:
我知道弹出窗口永远不会打开。我会试试你的方法已经谢谢了 效果很好,谢谢!以上是关于QML self.emit 启动函数以打开弹出窗口。不起作用[关闭]的主要内容,如果未能解决你的问题,请参考以下文章