Windows 和 Linux 在 QT 中的形式差异
Posted
技术标签:
【中文标题】Windows 和 Linux 在 QT 中的形式差异【英文标题】:Form differences in QT between Windows and Linux 【发布时间】:2018-03-22 14:43:35 【问题描述】:我使用 PyQt5 创建了一个应用程序,该应用程序在 Windows 和 Linux 上运行良好,但只有一种形式。我试图弄清楚为什么表单在 Windows 上正确显示,但在 Linux 系统上却没有。
第一个表单是我使用 Designer 制作的简单登录表单。它具有垂直布局和字段的网格布局。它在设计师中看起来像这样。
这在 Windows 中看起来不错:
但在 Linux Mint 17.03 中,字段被挤压并且高度不正确:
在 Unbutu 14.04 中类似:
我打开表单的代码如下所示:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from login import *
import csv
class Login(QDialog):
"""User login """
def __init__(self):
QDialog.__init__(self)
self.ui = Ui_login_form()
self.ui.setupUi(self)
self.ui.buttonBox.accepted.connect(lambda: self.handle_login(servers=servers))
servers =
with open('servers.csv', newline='') as csvfile:
server_reader = csv.reader(csvfile)
for row in server_reader:
self.ui.cbo_db_name.addItem(row[1])
servers[row[1]] = (row[0],row[2],row[3])
def handle_login(self, servers=''):
the_key = self.ui.cbo_db_name.currentText()
self.server = servers[the_key][0]
if __name__=="__main__":
app=QApplication(sys.argv)
access = Login()
access.exec_()
print(access.server)
myapp = Test_form()
myapp.show()
sys.exit(app.exec_())
来自 Qt 设计器的表单代码如下所示:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_login_form(object):
def setupUi(self, login_form):
login_form.setObjectName("login_form")
login_form.resize(223, 129)
self.layoutWidget = QtWidgets.QWidget(login_form)
self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 198, 105))
self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
self.verticalLayout.setObjectName("verticalLayout")
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.label = QtWidgets.QLabel(self.layoutWidget)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
self.password = QtWidgets.QLineEdit(self.layoutWidget)
self.password.setEchoMode(QtWidgets.QLineEdit.Password)
self.password.setObjectName("password")
self.gridLayout.addWidget(self.password, 2, 1, 1, 1)
self.username = QtWidgets.QLineEdit(self.layoutWidget)
self.username.setObjectName("username")
self.gridLayout.addWidget(self.username, 1, 1, 1, 1)
self.label_2 = QtWidgets.QLabel(self.layoutWidget)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
self.cbo_db_name = QtWidgets.QComboBox(self.layoutWidget)
self.cbo_db_name.setObjectName("cbo_db_name")
self.gridLayout.addWidget(self.cbo_db_name, 0, 1, 1, 1)
self.label_3 = QtWidgets.QLabel(self.layoutWidget)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 0, 0, 1, 1)
self.verticalLayout.addLayout(self.gridLayout)
self.buttonBox = QtWidgets.QDialogButtonBox(self.layoutWidget)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
self.buttonBox.setObjectName("buttonBox")
self.verticalLayout.addWidget(self.buttonBox)
self.label.setBuddy(self.username)
self.label_2.setBuddy(self.password)
self.retranslateUi(login_form)
self.buttonBox.accepted.connect(login_form.accept)
self.buttonBox.rejected.connect(login_form.reject)
QtCore.QMetaObject.connectSlotsByName(login_form)
login_form.setTabOrder(self.username, self.password)
login_form.setTabOrder(self.password, self.cbo_db_name)
def retranslateUi(self, login_form):
_translate = QtCore.QCoreApplication.translate
login_form.setWindowTitle(_translate("login_form", "Please log in..."))
self.label.setText(_translate("login_form", "User name:"))
self.label_2.setText(_translate("login_form", "Password:"))
self.label_3.setText(_translate("login_form", "Database:"))
【问题讨论】:
实际上,Windows 字段的高度非常小。如果我没记错的话,字段应该和按钮一样高 【参考方案1】:在 Qt Creator 中打开您的 UI 文件,右键单击对话框区域并选择Lay out
,然后选择Lay Out Vertically
或Lay Out Horizontally
。
这应该允许对话框的内容能够“拉伸”到登录对话框的完整大小。
【讨论】:
我破坏了布局并按照您的建议再次应用它。我不确定我之前做了什么,但有一个垂直布局。我很感谢您的及时答复。谢谢! 好的,非常感谢!以上是关于Windows 和 Linux 在 QT 中的形式差异的主要内容,如果未能解决你的问题,请参考以下文章
Qt 线程代码在 MAC、Linux 和 Windows 中的不同行为
Linux 上 C 中的 UDP 发送方和 Windows 上 Qt 中的接收方不起作用? [关闭]