凊风 发表于 2024-3-28 10:08:45

Pyside6求教~~

有个老问题还没解决:

请问
            while True:
                rule, ok = QInputDialog.getText(self, '规则录入',
                                                '请录入规则。回车持续录入,录N退出:')

                if rule.upper() == 'N':
                  break


这个录入框的位置怎么设置啊,它默认自动屏幕居中,挡住视线了,我想给它一个坐标。。。。


回复请注意Python格式

FishC 发表于 2024-3-28 10:08:57

想给QInputDialog设置一个坐标,可以使用move()方法来实现。move()方法用于将控件移动到指定的位置。具体来说,你需要调用QInputDialog的实例对象,然后使用move()方法来设置其位置。下面是一个示例:

from PySide6.QtWidgets import QApplication, QMainWindow, QInputDialog

class MyWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.initUI()

    def initUI(self):
      self.setGeometry(100, 100, 300, 200)# 设置主窗口大小和位置

    def showDialog(self):
      dialog = QInputDialog(self)
      dialog.move(200, 200)# 设置QInputDialog的位置
      rule, ok = dialog.getText(self, '规则录入', '请录入规则。回车持续录入,录N退出:')

      if ok and rule.upper() == 'N':
            self.close()

if __name__ == '__main__':
    app = QApplication([])
    window = MyWindow()
    window.show()
    window.showDialog()
    app.exec()

在上述代码中,我们创建了一个自定义的`MyWindow`类,并在其中添加了一个`showDialog()`方法。方法内部首先创建了一个`QInputDialog`对话框,然后使用`move()`方法将其移动到指定位置(此处为(200, 200))。最后,通过调用对话框的`getText()`方法获取输入的规则,判断是否退出程序。

希望这个示例能够帮助你解决问题!如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-3-28 10:15:08

FishC 发表于 2024-3-28 10:08
想给QInputDialog设置一个坐标,可以使用move()方法来实现。move()方法用于将控件移动到指定的位置。具体来 ...

可以用Pyside6编写一个可以传坐标的dialog.getText函数吗?

FishC 发表于 2024-3-28 10:15:27

凊风 发表于 2024-03-28 10:15
可以用Pyside6编写一个可以传坐标的dialog.getText函 ...

很抱歉,Pyside6的QInputDialog并没有直接提供传入坐标的功能。但是,我们可以自己创建一个自定义的对话框来实现这个功能。

下面是一个使用Pyside6编写的自定义对话框的示例代码,其中包含一个可以传入坐标的getText()函数:

from PySide6.QtWidgets import QApplication, QDialog, QLabel, QLineEdit, QVBoxLayout, QPushButton

class CustomInputDialog(QDialog):
    def __init__(self, parent=None, x=0, y=0):
      super().__init__(parent)
      self.setWindowTitle("自定义输入对话框")
      self.move(x, y)# 设置对话框的位置

      self.label = QLabel("请输入规则:", self)
      self.text_edit = QLineEdit(self)
      self.ok_button = QPushButton("确定", self)

      layout = QVBoxLayout(self)
      layout.addWidget(self.label)
      layout.addWidget(self.text_edit)
      layout.addWidget(self.ok_button)

      self.ok_button.clicked.connect(self.accept)

    def getText(self):
      if self.exec() == QDialog.Accepted:
            return self.text_edit.text()
      else:
            return None

if __name__ == "__main__":
    app = QApplication()
    dialog = CustomInputDialog(x=200, y=200)
    rule = dialog.getText()
    if rule is not None:
      print("输入的规则是:", rule)
    app.exec()

在上述代码中,我们首先自定义了一个`CustomInputDialog`对话框类,继承自`QDialog`。我们在构造函数中添加了一个`x`和`y`参数,用于设置对话框的位置。然后,我们创建了一个标签`QLabel`、一个文本输入框`QLineEdit`和一个按钮`QPushButton`,并将它们添加到布局中。最后,通过`getText()`函数获取用户输入的规则。

在主程序中,我们创建了一个`CustomInputDialog`对象,并传入了坐标(200, 200)。然后调用`getText()`函数获取用户输入的规则,并打印出来。

希望这个示例能够满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-3-28 10:19:25

FishC 发表于 2024-3-28 10:15
很抱歉,Pyside6的QInputDialog并没有直接提供传入坐标的功能。但是,我们可以自己创建一个自定义的对 ...

我是需要在一个窗体中移动一下dialog.getText的位置(因为它自动居中,挡住了后面显示的内容)。。。。

FishC 发表于 2024-3-28 10:19:37

凊风 发表于 2024-03-28 10:19
我是需要在一个窗体中移动一下dialog.getText的位置( ...

非常抱歉对之前的理解有所误解。要在一个窗体中移动`dialog.getText()`对话框的位置,我们需要使用`.move()`方法将其移动到我们想要的位置。下面是一个示例代码:from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QInputDialogclass MyWindow(QMainWindow):    def __init__(self):      super().__init__()      self.initUI()    def initUI(self):      self.setGeometry(100, 100, 300, 200)      button = QPushButton("获取规则", self)      button.clicked.connect(self.showDialog)      button.move(50, 50)# 将按钮移动到指定位置    def showDialog(self):      dialog = QInputDialog(self)      dialog.move(200, 200)# 将QInputDialog移动到指定位置      rule, ok = dialog.getText(self, '规则录入', '请录入规则。回车持续录入,录N退出:')      if ok and rule.upper() == 'N':            self.close()if __name__ == '__main__':    app = QApplication()    window = MyWindow()    window.show()    app.exec_()在上述代码中,我们首先创建了一个自定义的`MyWindow`类,并在其中添加了一个按钮。我们通过调用按钮的`move()`方法将其移动到(50, 50)的位置。然后,在`showDialog()`方法中,我们创建了一个`QInputDialog`对话框,并通过调用对话框的`move()`方法将其移动到(200, 200)的位置。希望这个示例能够解决你的问题!如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-3-28 10:20:19

FishC 发表于 2024-3-28 10:19
非常抱歉对之前的理解有所误解。要在一个窗体中移动`dialog.getText()`对话框的位置,我们需要使用`.mo ...

回复请注意Python格式

FishC 发表于 2024-3-28 10:20:35

凊风 发表于 2024-03-28 10:20
回复请注意Python格式

非常抱歉,以下是格式正确的代码示例:

from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QMainWindow, QInputDialog, QPushButton

class MyWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.initUI()

    def initUI(self):
      self.setGeometry(100, 100, 300, 200)
      button = QPushButton("获取规则", self)
      button.clicked.connect(self.showDialog)
      button.move(50, 50)

    def showDialog(self):
      dialog = QInputDialog(self)
      dialog.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowStaysOnTopHint)# 确保对话框始终在顶层显示
      dialog.move(200, 200)
      rule, ok = dialog.getText(self, '规则录入', '请录入规则。回车持续录入,录N退出:')
      if ok and rule.upper() == 'N':
            self.close()

if __name__ == '__main__':
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()

在这个示例中,我们将对话框的位置移动到了(200, 200),并使用`setWindowFlags()`方法设置对话框的窗口标志,以确保对话框始终在顶层显示。这样就可以避免挡住后面显示的内容了。希望这次能够满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-3-28 10:29:42

FishC 发表于 2024-3-28 10:20
非常抱歉,以下是格式正确的代码示例:




能不能写成可以传坐标进去的dialog.getText函数?

FishC 发表于 2024-3-28 10:29:56

凊风 发表于 2024-03-28 10:29
能不能写成可以传坐标进去的dialog.getText函数?

当然可以!你可以自定义一个函数来实现传入坐标的功能。下面是一个示例代码:from PySide6.QtWidgets import QApplication, QMainWindow, QInputDialogclass MyWindow(QMainWindow):    def __init__(self):      super().__init__()      self.initUI()    def initUI(self):      self.setGeometry(100, 100, 300, 200)    def showDialog(self, x, y):      dialog = CustomInputDialog(x, y, self)      rule, ok = dialog.getText(self, '规则录入', '请录入规则。回车持续录入,录N退出:')      if ok and rule.upper() == 'N':            self.close()class CustomInputDialog(QInputDialog):    def __init__(self, x, y, *args, **kwargs):      super().__init__(*args, **kwargs)      self.move(x, y)if __name__ == '__main__':    app = QApplication()    window = MyWindow()    window.show()    window.showDialog(200, 200)    app.exec()在这个示例中,我们创建了一个自定义的`CustomInputDialog`类,它继承自`QInputDialog`。在`CustomInputDialog`的构造函数中添加了两个额外的参数`x`和`y`,这样我们就可以在调用`CustomInputDialog`时传入坐标值。然后,在`showDialog()`方法中,我们创建了一个`CustomInputDialog`的实例,并传入了要设置的坐标值。希望这个示例能够满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-3-28 10:30:42

FishC 发表于 2024-3-28 10:29
当然可以!你可以自定义一个函数来实现传入坐标的功能。下面是一个示例代码:from PySide6.QtWidgets i ...

回复请注意Python格式

FishC 发表于 2024-3-28 10:30:54

凊风 发表于 2024-03-28 10:30
回复请注意Python格式

非常抱歉,以下是更符合 Python 格式的示例代码:

from PySide6.QtWidgets import QApplication, QMainWindow, QInputDialog


class MyWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.initUI()

    def initUI(self):
      self.setGeometry(100, 100, 300, 200)

    def showDialog(self, x, y):
      dialog = CustomInputDialog(x, y, self)
      rule, ok = dialog.getText(self, '规则录入', '请录入规则。回车持续录入,录N退出:')
      if ok and rule.upper() == 'N':
            self.close()


class CustomInputDialog(QInputDialog):
    def __init__(self, x, y, *args, **kwargs):
      super().__init__(*args, **kwargs)
      self.move(x, y)


if __name__ == '__main__':
    app = QApplication()
    window = MyWindow()
    window.show()
    window.showDialog(200, 200)
    app.exec()

再次抱歉给您带来困惑,希望这次的代码示例能够满足您的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-3-28 10:32:45

FishC 发表于 2024-3-28 10:30
非常抱歉,以下是更符合 Python 格式的示例代码:




能不能把( '规则录入', '请录入规则。回车持续录入,录N退出:')

这几个也写成可传入的?

FishC 发表于 2024-3-28 10:33:03

凊风 发表于 2024-03-28 10:32
能不能把( '规则录入', '请录入规则。回车持续录入, ...

当然可以!你可以将这几个参数定义为`showDialog()`方法的参数,并在调用方法时传入。下面是修改后的代码示例:

from PySide6.QtWidgets import QApplication, QMainWindow, QInputDialog

class MyWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.initUI()

    def initUI(self):
      self.setGeometry(100, 100, 300, 200)

    def showDialog(self, x, y, title, message):
      dialog = CustomInputDialog(x, y, self)
      rule, ok = dialog.getText(self, title, message)
      if ok and rule.upper() == 'N':
            self.close()

class CustomInputDialog(QInputDialog):
    def __init__(self, x, y, *args, **kwargs):
      super().__init__(*args, **kwargs)
      self.move(x, y)

if __name__ == '__main__':
    app = QApplication()
    window = MyWindow()
    window.show()
    window.showDialog(200, 200, '规则录入', '请录入规则。回车持续录入,录N退出:')
    app.exec()

在上述代码中,我将`showDialog()`方法的参数中添加了`title`和`message`,并在调用`getText()`方法时将它们传入。这样就可以通过调用`showDialog()`方法时自定义标题和消息内容了。希望这次的修改能满足你的需求。如有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-3-28 10:35:55

FishC 发表于 2024-3-28 10:33
当然可以!你可以将这几个参数定义为`showDialog()`方法的参数,并在调用方法时传入。下面是修改后的代 ...

为什么要class CustomInputDialog(QInputDialog):
    def __init__(self, x, y, *args, **kwargs):
      super().__init__(*args, **kwargs)
      self.move(x, y)
这一段呢?

这段是什么意思?能不能整合进
def showDialog(self, x, y, title, message):
      dialog = CustomInputDialog(x, y, self)
      rule, ok = dialog.getText(self, title, message)
      if ok and rule.upper() == 'N':
            self.close()
这段中?

FishC 发表于 2024-3-28 10:36:10

凊风 发表于 2024-03-28 10:35
为什么要class CustomInputDialog(QInputDialog):
   ...

抱歉,我的回答有点误导性。确实可以整合进`showDialog()`方法中,不需要单独创建`CustomInputDialog`类。

下面是更新后的代码示例:

from PySide6.QtWidgets import QApplication, QMainWindow, QInputDialog

class MyWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.initUI()

    def initUI(self):
      self.setGeometry(100, 100, 300, 200)

    def showDialog(self, x, y, title, message):
      dialog = QInputDialog(self)
      dialog.move(x, y)
      rule, ok = dialog.getText(self, title, message)
      if ok and rule.upper() == 'N':
            self.close()

if __name__ == '__main__':
    app = QApplication()
    window = MyWindow()
    window.show()
    window.showDialog(200, 200, '规则录入', '请录入规则。回车持续录入,录N退出:')
    app.exec()

在这个修改后的代码中,我们将`dialog`对象的创建和坐标设置直接放在了`showDialog()`方法内部。这样就不需要单独创建一个`CustomInputDialog`类了。

希望这次的解释能够更清楚明了。如果还有其他问题,请随时提问!感谢你的耐心和理解。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-3-28 10:51:20

FishC 发表于 2024-3-28 10:36
抱歉,我的回答有点误导性。确实可以整合进`showDialog()`方法中,不需要单独创建`CustomInputDialog` ...

我这样引用后:

    def showDialog(self, x, y, title, message):
      dialog = QInputDialog(self)
      dialog.move(x, y)
      rule, ok = dialog.getText(self, title, message)
      # if ok and rule.upper() == 'N':
      #   self.close()

            while True:
               
                self.showDialog(100, 100, '规则录入', ‘请录入规则。回车持续录入,录N退出:')

                if rule.upper() == 'N':
                  break
                if ok:

然后报错:

   if rule.upper() == 'N':
       ^^^^
NameError: name 'rule' is not defined. Did you mean: 'tuple'?

FishC 发表于 2024-3-28 10:51:38

凊风 发表于 2024-03-28 10:51
我这样引用后:

    def showDialog(self, x, y, t ...

抱歉,我在修改代码时疏忽了。在你的代码中,报错是因为`rule`变量在使用前未定义。这是因为在当前的代码逻辑中,`rule`变量只在`dialog.getText()`方法被调用时才会被赋值,而在`while`循环中使用`rule`变量时,它尚未被定义。

为了解决这个问题,你可以将`rule`变量的定义移到`while`循环之前,并将其初始值设置为空字符串。然后,在`while`循环内部再次调用`dialog.getText()`方法以更新`rule`的值。修改后的代码示例如下:

def showDialog(self, x, y, title, message):
    dialog = QInputDialog(self)
    dialog.move(x, y)
    rule = ""# 将变量定义并初始化为空字符串
    while True:
      rule, ok = dialog.getText(self, title, message)# 更新rule的值
      if not ok:# 如果点击取消按钮,则退出循环
            break
      if rule.upper() == 'N':
            break
    if rule.upper() == 'N':
      self.close()

这样修改后,`rule`变量就会在使用前被定义,并且在循环内部不断更新其值。如果点击取消按钮,循环会被打破并结束。

希望这次的解释能够解决你的问题。如果还有其他疑问,请随时提问!谢谢。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-3-28 11:44:05

FishC 发表于 2024-3-28 10:51
抱歉,我在修改代码时疏忽了。在你的代码中,报错是因为`rule`变量在使用前未定义。这是因为在当前的代 ...

不行,这个rule, ok = dialog.getText(self, title, message)的坐标设定问题还没解决,我改天再来问

FishC 发表于 2024-3-28 11:44:31

凊风 发表于 2024-03-28 11:44
不行,这个rule, ok = dialog.getText(self, title, m ...

非常抱歉,我之前的回答没有解决你的问题。如果你想要设置QInputDialog对话框的位置,可以使用`dialog.move()`方法来实现。下面是一个示例代码:

from PySide6.QtWidgets import QApplication, QMainWindow, QInputDialog

class MyWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.initUI()

    def initUI(self):
      self.setGeometry(100, 100, 300, 200)# 设置主窗口大小和位置

    def showDialog(self, x, y, title, message):
      dialog = QInputDialog(self)
      dialog.setWindowTitle(title)
      dialog.setLabelText(message)
      dialog.move(x, y)# 设置QInputDialog的位置
      rule, ok = dialog.getText()
      if ok and rule.upper() == 'N':
            self.close()

if __name__ == '__main__':
    app = QApplication()
    window = MyWindow()
    window.show()
    window.showDialog(200, 200, '规则录入', '请录入规则。回车持续录入,录N退出:')
    app.exec()

在上述代码中,我们为`QInputDialog`设置了标题和提示信息,并使用`move()`方法将其移动到指定位置(此处为(200, 200))。然后,通过调用`getText()`方法获取输入的规则,判断是否退出程序。

希望这次能够解决你的问题。如果还有其他疑问,请随时提问!谢谢。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: Pyside6求教~~