- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试解决我在使用 Python 开发的 Qt 应用程序时遇到的问题。我只有一个简单的主窗口和一个模态 QDialog 设置,用于在主窗口上触发菜单操作后收集用户输入。 QDialog 的行为符合预期,因为我已经能够确认测试打印是在 QDialog 返回 Accepted 时执行的,但是应用程序将在 print 语句之后完全崩溃,没有错误消息。当 QDialog 返回 Rejected 时会发生相同的行为。澄清一下,主窗口显示了几秒钟,应用程序崩溃了,没有错误消息。我希望该函数在收到来自下面的 Process 函数的任一结果后,将焦点返回到主窗口(它仍然打开以进行操作)。
我也曾尝试使 QDialog 成为无模式的(使用 show),并且 QDialog 的接受/拒绝函数似乎按预期返回到主窗口,但是再次调用调出 QDialog 的函数会使应用程序崩溃。我在这个项目中使用 pyqt 5.9,但我在 pyqt 5.6 的许多其他项目中使用了与下面代码基本相同的设置,但没有发生这种情况。我试图弄清楚 pyqt 5.9 是否存在任何可能导致此问题的已知问题,或者我的代码中是否存在导致此崩溃发生的错误。我正在考虑回滚到 5.6 看看是否可以解决这个问题,但我觉得可能是我误解了导致这种情况发生的原因。
我在 Windows 10 上通过 Anaconda 提示符(Anaconda 4.8.3、Python 3.7)运行代码,因为 Qt 应用程序在 Spyder 中重复运行时仍然存在问题。我正在使用 Anaconda 附带的 pyqt,并且没有对 pyqt 进行任何额外的 pip 安装。
主窗口代码
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QGridLayout, QHBoxLayout, QVBoxLayout, QAction, QLabel
from PyQt5.QtWidgets import QDialog, QListWidget, QListWidgetItem, QAbstractItemView, QPushButton, QLineEdit, QSpacerItem, QSizePolicy
class FirstWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.title = 'Window 1'
self.left = 350
self.top = 150
self.width = 800
self.height = 500
self.setWindowTitle(self.title)
self.setGeometry(self.left,self.top,self.width,self.height)
widget = QWidget()
self.setCentralWidget(widget)
grid = QGridLayout()
widget.setLayout(grid)
mainMenu = self.menuBar()
mainMenu.setNativeMenuBar(False)
subMenu = mainMenu.addMenu('File')
modifyDB = QAction('Test',self)
subMenu.addAction(modifyDB)
modifyDB.triggered.connect(self.Process)
self.statusBar().showMessage('Ready')
def Process(self):
dialog = DialogWin()
if dialog.exec_() == QDialog.Accepted:
print('test passed')
if __name__ == '__main__':
if not QApplication.instance():
app = QApplication(sys.argv)
else:
app = QApplication.instance()
mainWin = FirstWindow()
mainWin.show()
app.exec_()
对话代码
class DialogWin(QDialog):
def __init__(self,parent=None):
super(DialogWin,self).__init__(parent)
self.title = 'Database Table Name Selection'
self.left = 350
self.top = 150
self.width = 300
self.height = 300
self.setWindowTitle(self.title)
self.setGeometry(self.left,self.top,self.width,self.height)
vbox = QVBoxLayout()
spacer = QSpacerItem(10,10,QSizePolicy.Expanding,QSizePolicy.Expanding)
self.list_exp = QLabel('Select Existing Table to Overwrite')
vbox.addWidget(self.list_exp)
self.table_list = QListWidget()
self.table_list.setSelectionMode(QAbstractItemView.SingleSelection)
vbox.addWidget(self.table_list)
hbox = QHBoxLayout()
hbox.addItem(spacer)
self.option_exp = QLabel('<span style="font-size:8pt; font-weight:600; color:#aa0000;">OR</span>')
hbox.addWidget(self.option_exp)
hbox.addItem(spacer)
vbox.addLayout(hbox)
self.new_name = QLineEdit(placeholderText='Enter New Source Name')
vbox.addWidget(self.new_name)
hbox = QHBoxLayout()
self.okButton = QPushButton('OK')
hbox.addWidget(self.okButton)
self.okButton.clicked.connect(self.accept)
self.cancelButton = QPushButton('Cancel')
hbox.addWidget(self.cancelButton)
self.cancelButton.clicked.connect(self.reject)
vbox.addLayout(hbox)
self.setLayout(vbox)
item = QListWidgetItem('No Tables Available...')
item.setFlags(item.flags() ^ Qt.ItemIsSelectable)
self.table_list.addItem(item)
有关此问题的任何意见都将非常有帮助。我花了很多时间试图了解此设置如何在一个应用程序中为我工作而不在另一个应用程序中工作。
最佳答案
问题是您使用了同一个 QSpacerItem 2 次,当 QDialog 关闭时,因为它是一个局部变量,它将被删除,Qt 也会消除内部对象,在这种情况下,QSpacerItem 将有导致“段错误”的双重消除。
您必须创建 2 个 QSpacerItem:
# ...
hbox = QHBoxLayout()
hbox.addItem(spacer)
self.option_exp = QLabel('OR')
hbox.addWidget(self.option_exp)
<b>hbox.addItem(QSpacerItem(10,10,QSizePolicy.Expanding,QSizePolicy.Expanding))</b>
vbox.addLayout(hbox)
# ...
另一种选择是不使用 QSpacerItem 而是设置一个拉伸(stretch)因子:
# ...
hbox = QHBoxLayout()
<b>hbox.addStretch()</b>
self.option_exp = QLabel('OR')
hbox.addWidget(self.option_exp)
<b>hbox.addStretch()</b>
vbox.addLayout(hbox)
# ...
或者不使用QHBoxLayout,通过设置对齐方式直接将QLabel设置为QVBoxLayout:
# ...
self.table_list = QListWidget()
self.table_list.setSelectionMode(QAbstractItemView.SingleSelection)
vbox.addWidget(self.table_list)
self.option_exp = QLabel('OR')
<b>vbox.addWidget(self.option_exp, alignment=Qt.AlignHCenter)</b>
self.new_name = QLineEdit(placeholderText='Enter New Source Name')
vbox.addWidget(self.new_name)
# ...
关于python - PyQt5 应用程序中的故障排除(QDialog -> QMainWindow),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62767250/
在我的主应用程序中,我打开了一个 QDialog,我想从这个 QDialog 打开/显示另一个。它没有显示第二个带有焦点的对话框,而是出现在我的主应用程序后面并被阻止/禁用,我无法使用它。每个表单都在
在我的 Qt 应用程序中,我面临以下情况:当引发特定事件时,我会显示一个无模式的 QDialog,它要求用户进行确认。使用 QMainWindow 中的 show() 函数显示对话框。任何时候引发事件
我创建了一个具有主窗口的应用程序,并从该窗口创建了一个 QDialog。这个 QDialog 应该创建一个 RenderThread 来发出从相机接收到的图像,或者在示例中发出文本。当我调试它时,似乎
在 Qt 中,我每次单击某个项目时都会打开 QDialog 窗口我用 new 来做,我想确保我只为每个项目打开一个 QDialog 实例我正在点击: void foo::treeWidget_item
基于Qt 4.8的应用程序-QDialog出现问题,最小化按钮 Windows和Gnome(Linux) 出现模式对话框,并在右上角显示关闭按钮,并且最小化按钮为不存在。 最小化选项在每个对话框中以灰
我想做一个QDialog的背景透明的,所以我可以透过 window 看到。我问是因为我想使用半透明背景图像来创建“圆角窗口”错觉。使用 setOpacity对我来说不是一个选择,因为我希望所有小部件保
我一直在尝试关闭从主窗口分支出来的 QDialog 窗口。到目前为止,以下内容对我不起作用: self.close() QDialog.close() 我尝试了其他命令,例如 exit 和 exec_
我正在使用 Qt Creator 开发 Qt 5.5。我有一个名为 settingsWindow 的大类,顾名思义,它负责各种设置。这些设置然后用于启动一些 QDialogs,这些 QDialogs
我正在使用 qt-creator 构建一个小型 QT 应用程序。 我有一个主窗口,其中有一些控件,例如“新联系人”按钮。按下按钮,会显示一个 QDialog,它包含 3 行编辑:姓名、手机和电子邮件。
我有一个派生自 QDialog 的类。我有一个静态实例,我使用 exec 多次显示它。如果用户手动调整对话框的大小,我希望以后调用 exec 以以前的大小启动它。 我看过一些使用 QSettings
当使用带有动态内容的QDialog时,窗口的大小可能会变大以更好地适应内容。 但是,在我的例子中,我还希望它在内容变小时自动缩小它的大小(在我的例子中,一个表格可能会因所做的选择而有所不同)。 我怎样
如何简单地设置 QDialog 的背景?我可以轻松设置背景颜色,但是当我尝试使用图像时,我的背景变黑了。我试图使用:QPallete 和 QBrush,StyleSheets :(。 最佳答案 你可以
我有一个由中央应用程序创建和管理的对话。对话在运行时生成小部件,并具有将对话恢复为其默认排列的成员函数,即顶部的按钮框和底部的单个小部件。隐藏对话时调用此恢复函数。我可以从对话中取出额外的小部件,但我
我有一个主窗口,当我按下一个按钮时,它会创建一个 QDialog(它的名字是 qds)。当我关闭主窗口时,我希望 QDialog 也关闭。但是,当我关闭主窗口时,QDialog 仍然打开并且应用程序仍
我是 Qt 的新手,在创建新对话框时遇到了问题。这是它的类: class MyDialog : public QDialog, public Ui::ConnectToSource { public:
我有一个像这样打开的 QDialog: void MyModule::openDialog() { this->dialog->open(); printf("Hello World"
如果我将 QDialog 结果值作为 QDialog::Accepted,那么该值存储在哪里?而且,知道这样的值(value)有什么好处? 谢谢。 最佳答案 您可以通过调用 QDialog 的 res
如果我创建我的 QDialog 并使用 exec() 以模态显示它,一切正常,但我不需要这个非模态! 使用 show() 对话框是空的! ProgramLoading *programLoading
我想知道如何在鼠标悬停时显示 QDialog。我知道如何设置上下文菜单,但我希望在鼠标悬停时显示 QDialog。 这就是我正在做的(显然不起作用) void mouseMoveEvent( QMou
我有一个主窗口,它可以从 MySQL 进行一些搜索,例如。如果我输入“abc”,它会搜索所有包含“abc”的邮件,然后它将所有结果插入 QTableWidget 并显示它,如果我双击其中任何一个,它将
我是一名优秀的程序员,十分优秀!