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 启动函数以打开弹出窗口。不起作用[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中动态创建 Popup

c语言怎么启动vbs脚本不弹出黑窗口呢,跪谢?

为啥电脑每次开机都会弹出“函数错误”的窗口?

QML Popup弹窗置于最顶层,实现点击位置该弹出窗口下方的任何其他层组件,Popup弹窗都不会关闭

QT/QML 从主窗口重新打开新窗口

如果应用程序终止后从通知正文启动应用程序,则打开弹出窗口