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 VerticallyLay Out Horizontally

这应该允许对话框的内容能够“拉伸”到登录对话框的完整大小。

【讨论】:

我破坏了布局并按照您的建议再次应用它。我不确定我之前做了什么,但有一个垂直布局。我很感谢您的及时答复。谢谢! 好的,非常感谢!

以上是关于Windows 和 Linux 在 QT 中的形式差异的主要内容,如果未能解决你的问题,请参考以下文章

Qt 线程代码在 MAC、Linux 和 Windows 中的不同行为

Linux 上 C 中的 UDP 发送方和 Windows 上 Qt 中的接收方不起作用? [关闭]

如何在Windows下构建ARM Linux QT开发环境

将 Windows 编译的 QT 应用程序移植到 Linux?

在linux下,QT怎样编译出windows程序

从 Qt 4.x (Ubuntu Linux) 迁移到 Qt 5.1 (Windows 7)