PyQt标签在小部件上的定位

时间:2018-06-25 21:55:30

标签: python pyqt pyqt4

我创建一个简单的arduino项目。我的项目的主要目的是根据PIN状态(1或0)在LCD屏幕上显示文本。

为此,我创建了一个简单的表单并在其上添加了标签。启动时会显示默认文本,但是当我按下菜单按钮(模拟PIN = 1)时,文本将更改为“ WARNING_TEXT”

这是我的Python代码(这是我的应用程序的入口点):

import sys
from forms import MainForm2
import os
from PyQt4.QtGui import *


def main():
    app,  window = MainForm2.init()

    p = app.desktop().availableGeometry().center()
    window.move(p.x()-window.width()*0.5,p.y()-window.height()*0.5)
    window.setWindowTitle('Monitor') #<=Nazvanie app    
    window.showMaximized()
    sys.exit(app.exec_())

if __name__ =="__main__":
    main()

MainForm2的代码(所有应用程序逻辑在这里):

# -*- coding: utf-8 -*-

from PyQt4 import QtGui,QtCore
from PyQt4.QtGui import QSizePolicy,QColor
import sys
import time

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class QMainWindow(QtGui.QMainWindow):
    defaultStyle ='color:green;font-size:240px'
    warningStyle ='color:red;text-align: justify;font-size:{0}px'

    def __init__(self,parent=None):
        super(QtGui.QMainWindow,self).__init__(parent)
        self.cnfVacant = "Default text"
        self.cnfBusy = "Warning text"
        self.setupUi()

    def setupUi(self):
        self.thread=QMyThread()

        #timer
        self.timer = QtCore.QTimer()
        self.timer.setInterval(1000)
        self.timer.timeout.connect(self.displayTime)


        self.main = QtGui.QWidget(self)
        self.main.setAutoFillBackground(True)
        p = self.main.palette()
        p.setColor(self.main.backgroundRole(),QColor.fromRgb(0,0,0,255))
        self.main.setPalette(p)
        self.setCentralWidget(self.main)


        self.menubar = QtGui.QMenuBar(self)
        self.menubar.setGeometry(QtCore.QRect(0,0,559,25))
        #trigger
        self.menu_file_exit =QtGui.QAction(self.main)
        self.menu_file_exit.setText("Exit")

        self.menu_file_start = QtGui.QAction(self.main)
        self.menu_file_start.setText("Start")

        layout = QtGui.QGridLayout(self.main)

        self.label = QtGui.QLabel("",self.main)
        self.label.setText(_fromUtf8(self.cnfVacant.replace(" ","\n")))

        self.label.setStyleSheet(self.defaultStyle)
        self.label.setSizePolicy (QSizePolicy.Fixed,QSizePolicy.Expanding)
        self.label.setSizePolicy (QSizePolicy.Fixed,QSizePolicy.Expanding)



        layout.addWidget(self.label,10,10)
        layout.addWidget(self.lbl,50,50)

        self.connect(self.menu_file_exit, QtCore.SIGNAL('triggered()'), sys.exit)
        self.connect(self.menu_file_start,QtCore.SIGNAL('triggered()'),self.thread.run)

        QtCore.QObject.connect(self.thread,QtCore.SIGNAL('log(QString)'),self.tmp)

        self.menu_file = self.menubar.addMenu("File")
        self.menu_file.addAction(self.menu_file_start)
        self.menu_file.addAction(self.menu_file_exit)

        self.setMenuBar(self.menubar)
    def tmp(self,s):
        self.label.setText(_fromUtf8(self.cnfBusy))
        self.label.setWordWrap(True)
        self.label.setStyleSheet(self.warningStyle)
        self.label.setStyleSheet(self.warningStyle.format(self.cnfWarning[0]))
        print 'Hello sub {0}'.format(s)

    def displayTime(self):
        mDate=QtCore.QDateTime.currentDateTime().toString("dd.MM.yyyy")
        mTime=QtCore.QDateTime.currentDateTime().toString("HH:mm:ss")
        self.lbl.setText("{0} \n {1}".format(mDate,mTime))  

class QMyThread(QtCore.QThread):
    def __init__(self,parent=None):
        super(QtCore.QThread,self).__init__(parent)

    def run(self):
        i=0
        while True:
            i=i+1
            if(i==10):
                self.setLog("Hello from thread")
                time.sleep(0.3)
                break

    def setLog(self,text):
        self.emit(QtCore.SIGNAL('log(QString)'),QtCore.QString(text))

def init():
    app = QtGui.QApplication(sys.argv)
    MainWindow =QMainWindow()
    MainWindow.show()
    return app, MainWindow

有了这段代码,我只得到一个以表格为中心的标签,并且有两个问题:

  1. 长文本显示不正确。像“ bla bla blabla blablabla bla”之类的东西

  2. 如何在右下角的表单上获取第二个标签?

我想在附图上得到类似的图像:

enter image description here

有人可以指出我该怎么做吗?

1 个答案:

答案 0 :(得分:2)

在解决问题之前,我将指出您的代码可以进行的改进:

  • 请勿使用旧的连接方式,请选中new style
  • 如果不想修改它,则不必编写继承的类的构造函数。
  • 您不应该直接调用run()的{​​{1}}方法,否则任务将在主线程上运行,并且显然不必发送,您必须调用{{1} }方法,它将在内部创建线程,并且QThread方法将在该线程上执行。请记住,start()不是线程,而是线程处理程序。
  • 不要使用与您继承的类相同的名称,这可能会给您带来将来将难以调试的问题。

至此,仅需使用布局建立第一个run(),并使用QThread将其居中,并传递QLabel,告诉它水平和垂直聚焦

另一个setAlignment()表示您必须手动在几何中移动它的时间,每次修改QtCore.Qt.AlignCenter时都必须这样做,因此我们使用QLabel和方法更新文本。

QLabel