Как сделать метки, размещенные на QGridLayout, более последовательными? - PullRequest
0 голосов
/ 17 февраля 2020

Я делаю простую программу, которая читает некоторые данные из базы данных и отображает их в окне. Я решил использовать QGridLayout из PyQt5, но не могу go устранить несоответствие ширины надписей, размещенных на этом макете. Ниже приведена урезанная версия со случайными текстами вместо данных базы данных. Я бы хотел ВСЕГДА растягивать некоторые метки вправо, но иногда (в зависимости от текста) они занимают только часть пространства, предназначенного для них. Что я делаю не так? Примеры: enter image description hereenter image description here Кнопка «Refre sh» изменяет текст на другой случайный тип, а также изменяет макет. Код:

import random
import string
import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, qApp, QApplication, QGridLayout, QLabel, QMainWindow, QPushButton, QWidget


class GardenHelperUI(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Garden Helper')
        self.setFixedSize(800, 600)
        self.generalLayout = QGridLayout()
        self.bt_refresh = QPushButton('Refresh')
        self._centralWidget = QWidget(self)
        self.setCentralWidget(self._centralWidget)
        self._centralWidget.setLayout(self.generalLayout)
        self.status_bar = self.statusBar()
        self.status_bar.showMessage('Ready')
        self.tool_bar()
        self.toolbar.addWidget(self.bt_refresh)
        self.display_record()

    def tool_bar(self):
        exitAct = QAction(QIcon('img\exit.png'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.triggered.connect(qApp.quit)
        self.toolbar = self.addToolBar('Tools')
        self.toolbar.addAction(exitAct)
        self.bt_refresh.clicked.connect(self.display_record)

    def display_record(self):
        pl_namex = random_text(15)
        en_namex = random_text(15)
        lat_namex = random_text(15)
        descx = random_text(200)
        seedx = random_text(200)
        watx = random_text(200)
        likesx = random_text(200)
        maintx = random_text(200)
        self.clear_layout(self.generalLayout)
        self.create_label(pl_namex, 1, 1, 2, 2, 3)
        self.create_label(en_namex, 1, 4, 2, 2, 3)
        self.create_label(lat_namex, 1, 7, 2, 2, 3)
        self.create_label('Description:', 3, 1, 1, 2, 2)
        self.create_label(descx, 3, 3, 2, 9)
        self.create_label('Likes', 5, 1, 1, 2, 2)
        self.create_label(likesx, 5, 3, 2, 9)
        self.create_label('Seeding:', 7, 1, 1, 2, 2)
        self.create_label(seedx, 7, 3, 2, 9)
        self.create_label('Watering:', 9, 1, 1, 2, 2)
        self.create_label(watx, 9, 3, 2, 9)
        self.create_label('Maintenance:', 11, 1, 1, 2, 2)
        self.create_label(maintx, 11, 3, 2, 9)

    def create_label(self, label_text, pos_x: int, pos_y: int, rspan: int = 1, cspan: int = 1,
                     stylex: int = 1,
                     align=Qt.AlignLeft | Qt.AlignTop):
        new_label = QLabel(label_text)
        if stylex == 1:
            new_label.setStyleSheet('font: 11pt Roboto Light; color: black; background-color: #E7ECB1; border-style: '
                                    'solid; border-width: 1px; border-color: black')
        elif stylex == 2:
            new_label.setStyleSheet('font: 11pt Roboto Condensed; color: black')
        elif stylex == 3:
            new_label.setStyleSheet('font: 11pt Roboto Light Italic; color: #007E1F; background-color: #E2E2E2; '
                                    'border-style: '
                                    'solid; border-width: 0.5px; border-color: #969890')
        new_label.setWordWrap(True)
        self.generalLayout.addWidget(new_label, pos_x, pos_y, rspan, cspan, align)

    def clear_layout(self, layout):
        while layout.count() > 0:
            item = layout.takeAt(0)
            if not item:
                continue
            w = item.widget()
            if w:
                w.deleteLater()


def random_text(length):
    text_list = []
    letters = list(string.ascii_letters + string.digits + ' ' * 10)
    for i in range(length):
        text_list.append(letters[random.randint(0, len(letters) - 1)])
    text_str = ''.join(text_list)
    # print(text_str)
    return text_str


def main():
    garden_helper = QApplication(sys.argv)
    window = GardenHelperUI()
    window.show()
    sys.exit(garden_helper.exec_())


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 21 февраля 2020

Извините, но я не понимаю, зачем все время реформировать

new_label = QLabel (label_text)

и зачем вам нужен clear_layout метод

попробуйте:


main.py

import sys
import random
import string
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, qApp, QApplication, QGridLayout, QLabel, \
    QMainWindow, QPushButton, QWidget


baseUIClass, baseUIWidget = uic.loadUiType("garden_helper.ui")


class GardenHelperUI(QMainWindow, baseUIClass):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowTitle('Garden Helper')
#        self.setFixedSize(800, 600)

        self.bt_refresh = QPushButton('Refresh')
        self.status_bar = self.statusBar()
        self.status_bar.showMessage('Ready')
        self.tool_bar()
        self.toolbar.addWidget(self.bt_refresh)

        self._dictLabel = {
            'pl_namex':   random_text(15),
            'en_namex':   random_text(15),
            'lat_namex':  random_text(15),
            'descx':      random_text(200),
            'seedx':      random_text(200),
            'watx':       random_text(200),
            'likesx':     random_text(200),
            'maintx':     random_text(200),
        }

        self.stylex()
        self.display_record()

    def tool_bar(self):
        exitAct = QAction(QIcon('img\exit.png'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.triggered.connect(qApp.quit)
        self.toolbar = self.addToolBar('Tools')
        self.toolbar.addAction(exitAct)
        self.bt_refresh.clicked.connect(self.refresh_record)           # refresh_record

    def stylex(self):
        self.setStyleSheet('''
            #descx, #seedx, #watx, #likesx, #maintx {
                font: 11pt Roboto Light;                
                color: black; 
                background-color: #FFECB1;              
                border-style: solid; 
                border-width: 1px; 
                border-color: black;
            }
            #description, #likes, #seeding, #watering, #maintenance {
                font: 11pt Roboto Condensed; 
                color: black;
            }            
            #pl_namex, #en_namex, #lat_namex {
                font: 11pt Roboto Light Italic; 
                color: #007E1F; 
                background-color: #E2E2E2;
                border-style: solid; 
                border-width: 0.5px; 
                border-color: #969890;
                max-width: 150px;
                min-width: 150px;
                max-height: 30px;
            }             
        ''')

    def display_record(self):
        self.pl_namex.setText(self._dictLabel['pl_namex'])
        self.en_namex.setText(self._dictLabel['en_namex'])
        self.lat_namex.setText(self._dictLabel['lat_namex'])
        self.descx.setText(self._dictLabel['descx'])
        self.seedx.setText(self._dictLabel['seedx'])
        self.watx.setText(self._dictLabel['watx'])
        self.likesx.setText(self._dictLabel['likesx'])
        self.maintx.setText(self._dictLabel['maintx'])

    def refresh_record(self):
        self._dictLabel['pl_namex'] = random_text(15)
        self._dictLabel['en_namex'] = random_text(15)
        self._dictLabel['lat_namex'] = random_text(15)
        self._dictLabel['descx'] = random_text(200)
        self._dictLabel['seedx'] = random_text(200)
        self._dictLabel['watx'] = random_text(200)
        self._dictLabel['likesx'] = random_text(200)
        self._dictLabel['maintx'] = random_text(200)
        self.display_record()


def random_text(length):
    text_list = []
    letters = list(string.ascii_letters + string.digits + ' ' * 10)
    for i in range(length):
        text_list.append(letters[random.randint(0, len(letters) - 1)])
    text_str = ''.join(text_list)
    return text_str


if __name__ == '__main__':
    garden_helper = QApplication(sys.argv)
    window = GardenHelperUI()
    window.show()
    sys.exit(garden_helper.exec_())

garden_helper.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>750</width>
    <height>594</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
     <layout class="QGridLayout" name="gridLayout">
      <item row="0" column="6">
       <spacer name="horizontalSpacer_4">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>40</width>
          <height>20</height>
         </size>
        </property>
       </spacer>
      </item>
      <item row="4" column="0">
       <widget class="QLabel" name="waterin">
        <property name="minimumSize">
         <size>
          <width>100</width>
          <height>0</height>
         </size>
        </property>
        <property name="maximumSize">
         <size>
          <width>100</width>
          <height>16777215</height>
         </size>
        </property>
        <property name="text">
         <string>Watering:</string>
        </property>
       </widget>
      </item>
      <item row="5" column="1" colspan="6">
       <widget class="QLabel" name="maintx">
        <property name="text">
         <string/>
        </property>
        <property name="wordWrap">
         <bool>true</bool>
        </property>
        <property name="margin">
         <number>4</number>
        </property>
       </widget>
      </item>
      <item row="0" column="0">
       <spacer name="horizontalSpacer">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>40</width>
          <height>20</height>
         </size>
        </property>
       </spacer>
      </item>
      <item row="0" column="1">
       <widget class="QLabel" name="pl_namex">
        <property name="text">
         <string/>
        </property>
        <property name="alignment">
         <set>Qt::AlignCenter</set>
        </property>
       </widget>
      </item>
      <item row="0" column="5">
       <widget class="QLabel" name="lat_namex">
        <property name="text">
         <string/>
        </property>
        <property name="alignment">
         <set>Qt::AlignCenter</set>
        </property>
       </widget>
      </item>
      <item row="0" column="4">
       <spacer name="horizontalSpacer_3">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>40</width>
          <height>20</height>
         </size>
        </property>
       </spacer>
      </item>
      <item row="2" column="0">
       <widget class="QLabel" name="likes">
        <property name="minimumSize">
         <size>
          <width>100</width>
          <height>0</height>
         </size>
        </property>
        <property name="maximumSize">
         <size>
          <width>100</width>
          <height>16777215</height>
         </size>
        </property>
        <property name="text">
         <string>Likes:</string>
        </property>
       </widget>
      </item>
      <item row="0" column="3">
       <widget class="QLabel" name="en_namex">
        <property name="text">
         <string/>
        </property>
        <property name="alignment">
         <set>Qt::AlignCenter</set>
        </property>
       </widget>
      </item>
      <item row="0" column="2">
       <spacer name="horizontalSpacer_2">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>40</width>
          <height>20</height>
         </size>
        </property>
       </spacer>
      </item>
      <item row="4" column="1" colspan="6">
       <widget class="QLabel" name="likesx">
        <property name="text">
         <string/>
        </property>
        <property name="wordWrap">
         <bool>true</bool>
        </property>
        <property name="margin">
         <number>4</number>
        </property>
       </widget>
      </item>
      <item row="2" column="1" colspan="6">
       <widget class="QLabel" name="seedx">
        <property name="text">
         <string/>
        </property>
        <property name="wordWrap">
         <bool>true</bool>
        </property>
        <property name="margin">
         <number>4</number>
        </property>
       </widget>
      </item>
      <item row="1" column="0">
       <widget class="QLabel" name="description">
        <property name="sizePolicy">
         <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="minimumSize">
         <size>
          <width>100</width>
          <height>0</height>
         </size>
        </property>
        <property name="maximumSize">
         <size>
          <width>100</width>
          <height>16777215</height>
         </size>
        </property>
        <property name="sizeIncrement">
         <size>
          <width>0</width>
          <height>0</height>
         </size>
        </property>
        <property name="autoFillBackground">
         <bool>true</bool>
        </property>
        <property name="text">
         <string>Description:</string>
        </property>
       </widget>
      </item>
      <item row="5" column="0">
       <widget class="QLabel" name="maintenance">
        <property name="minimumSize">
         <size>
          <width>100</width>
          <height>0</height>
         </size>
        </property>
        <property name="maximumSize">
         <size>
          <width>100</width>
          <height>16777215</height>
         </size>
        </property>
        <property name="text">
         <string>Maintenance:</string>
        </property>
       </widget>
      </item>
      <item row="1" column="1" colspan="6">
       <widget class="QLabel" name="descx">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="text">
         <string/>
        </property>
        <property name="scaledContents">
         <bool>false</bool>
        </property>
        <property name="alignment">
         <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
        </property>
        <property name="wordWrap">
         <bool>true</bool>
        </property>
        <property name="margin">
         <number>4</number>
        </property>
       </widget>
      </item>
      <item row="3" column="1" colspan="6">
       <widget class="QLabel" name="watx">
        <property name="text">
         <string/>
        </property>
        <property name="wordWrap">
         <bool>true</bool>
        </property>
        <property name="margin">
         <number>4</number>
        </property>
       </widget>
      </item>
      <item row="3" column="0">
       <widget class="QLabel" name="seeding">
        <property name="minimumSize">
         <size>
          <width>100</width>
          <height>0</height>
         </size>
        </property>
        <property name="maximumSize">
         <size>
          <width>100</width>
          <height>16777215</height>
         </size>
        </property>
        <property name="text">
         <string>Seeding:</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

enter image description here

...