размещение виджетов во вкладках - PullRequest
0 голосов
/ 24 августа 2018

Итак, у меня есть этот код:

from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QWidget, QAction, QTabWidget, QVBoxLayout, QHBoxLayout, QComboBox, QLabel
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot
from lang import getLang
import sys, os, configparser

config = configparser.ConfigParser()
config.read("Settings.ini")

# Config get setting and change setting
#print(config.get("Main", "language"))
#config.set("Main", "language", "danish")
#with open("Settings.ini", "w") as cfg_file:
    #config.write(cfg_file)

class App(QMainWindow):
    def __init__(self):
        super().__init__()

        # Window Settings
        self.x, self.y, self.w, self.h = 0, 0, 300, 200

        self.setGeometry(self.x, self.y, self.w, self.h)

        self.window = MainWindow(self)
        self.setCentralWidget(self.window)
        self.setWindowTitle("Window title") # Window Title
        self.show()

class MainWindow(QWidget):        
    def __init__(self, parent):   
        super(QWidget, self).__init__(parent)
        layout = QVBoxLayout(self)

        # Run this after settings
        self.lang = getLang(config.get("Main", "language"))

        # Initialize tabs
        tab_holder = QTabWidget()   # Create tab holder
        tab_1 = QWidget()           # Tab one
        tab_2 = QWidget()           # Tab two

        # Add tabs
        tab_holder.addTab(tab_1, self.lang["tab_1_title"]) # Add "tab1" to the tabs holder "tabs"
        tab_holder.addTab(tab_2, self.lang["tab_2_title"]) # Add "tab2" to the tabs holder "tabs" 

        # Create first tab
        tab_1.layout = QVBoxLayout(self)
        tab_2.layout = QVBoxLayout(self)

        # Buttons
        button_start = QPushButton(self.lang["btn_start"])
        button_stop = QPushButton(self.lang["btn_stop"])
        button_test = QPushButton(self.lang["btn_test"])

        # Button Extra
        button_start.setToolTip("This is a tooltip for the button!")    # Message to show when mouse hover
        button_start.clicked.connect(self.on_click)

        button_stop.clicked.connect(self.on_click)

        button_test.clicked.connect(self.on_click)
        #button_start.setEnabled(False)

        # comboBox
        label_language = QLabel("Language")
        combo_language = QComboBox(self)
        combo_language.addItem(self.lang["language_danish"])
        combo_language.addItem(self.lang["language_english"])

        # Move widgets
        combo_language.move(50, 150)
        label_language.move(50, 50)

        # Tab Binding
        self.AddToTab(tab_1, button_start)
        self.AddToTab(tab_1, button_stop)
        self.AddToTab(tab_2, label_language)
        self.AddToTab(tab_2, combo_language)

        # Add tabs to widget        
        tab_1.setLayout(tab_1.layout)
        tab_2.setLayout(tab_2.layout)
        layout.addWidget(tab_holder)
        self.setLayout(layout)

    @pyqtSlot()
    def on_click(self):
        button = self.sender().text()
        if button == self.lang["btn_start"]:
            print("Dank")
        elif button == self.lang["btn_stop"]:
            print("Not dank")

    def AddToTab(self, tab, obj):
        tab.layout.addWidget(obj)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

В настоящее время создается окно, содержащее 2 кнопки на вкладке 1. Кнопки «Пуск» и «Стоп» без какой-либо реальной функции, кроме печати текста. На вкладке 2 у меня есть ярлык с надписью «Язык:» и выпадающее меню, которое содержит «Датский» и «Английский».

Проблема, с которой я столкнулся, заключается в том, что ее размещение действительно очень странное и раздражающее, как показано здесь: Tab One Tab 2

Я не уверен, как изменить размещение, поскольку я не могу просто использовать .move на текстовой метке, кнопках и раскрывающемся меню, поскольку они размещены на вкладках.

Например, на вкладке 2 я бы хотел, чтобы надпись «Язык:» находилась справа от раскрывающегося меню.

1 Ответ

0 голосов
/ 24 августа 2018

Проблема вызвана тем, что вы используете QVBoxLayout для установки виджетов внутри каждой вкладки. Задача макета состоит в том, чтобы управлять расположением и размером виджетов, чтобы вы не могли использовать move(), к тому же это не нужно.

Решение состоит в том, что вы создаете пользовательский макет для каждой вкладки, но при сохранении порядка создаст пользовательский виджет для каждой вкладки, в случае первой вкладки я продолжу использовать QVBoxlayout, но добавлю растяжку, чтобы виджет остается в верхнем положении. Во втором случае я объединю QVBoxLayout с QHBoxLayout, QHBoxLayout будет использовать его для размещения QLabel, а QComboBox и QVBoxLayout будут использовать его для перемещения виджетов вверх положение.

Реализуя вышеизложенное, я по понятным причинам опустил lang, получаем следующее:

from PyQt5 import QtCore, QtGui, QtWidgets
import sys, os, configparser

config = configparser.ConfigParser()
config.read("Settings.ini")

# Config get setting and change setting
#print(config.get("Main", "language"))
#config.set("Main", "language", "danish")
#with open("Settings.ini", "w") as cfg_file:
    #config.write(cfg_file)

class App(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        # Window Settings
        self.x, self.y, self.w, self.h = 0, 0, 300, 200
        self.setGeometry(self.x, self.y, self.w, self.h)

        self.window = MainWindow(self)
        self.setCentralWidget(self.window)
        self.setWindowTitle("Window title") # Window Title
        self.show()

class GeneralWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(GeneralWidget, self).__init__(parent)
        lay = QtWidgets.QVBoxLayout(self)
        # Buttons
        button_start = QtWidgets.QPushButton("start") #self.lang["btn_start"])
        button_stop = QtWidgets.QPushButton("stop") #self.lang["btn_stop"])

        # Button Extra
        button_start.setToolTip("This is a tooltip for the button!")    # Message to show when mouse hover
        button_start.clicked.connect(self.on_click)

        button_stop.clicked.connect(self.on_click)

        lay.addWidget(button_start)
        lay.addWidget(button_stop)
        lay.addStretch()

    @QtCore.pyqtSlot()
    def on_click(self):
        button = self.sender().text()
        if button == self.lang["btn_start"]:
            print("Dank")
        elif button == self.lang["btn_stop"]:
            print("Not dank")


class OptionsWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(OptionsWidget, self).__init__(parent)
        lay = QtWidgets.QVBoxLayout(self)
        hlay = QtWidgets.QHBoxLayout()
        lay.addLayout(hlay)
        lay.addStretch()

        label_language = QtWidgets.QLabel("Language")
        combo_language = QtWidgets.QComboBox(self)
        combo_language.addItem("item1") #self.lang["language_danish"])
        combo_language.addItem("item2") #self.lang["language_english"])
        hlay.addWidget(label_language)
        hlay.addWidget(combo_language)



class MainWindow(QtWidgets.QWidget):        
    def __init__(self, parent):   
        super(MainWindow, self).__init__(parent)
        layout = QtWidgets.QVBoxLayout(self)
        # Run this after settings
        # self.lang = getLang(config.get("Main", "language"))
        # Initialize tabs
        tab_holder = QtWidgets.QTabWidget()   # Create tab holder
        tab_1 = GeneralWidget()           # Tab one
        tab_2 = OptionsWidget()           # Tab two
        # Add tabs
        tab_holder.addTab(tab_1, "General") #self.lang["tab_1_title"]) # Add "tab1" to the tabs holder "tabs"
        tab_holder.addTab(tab_2, "Options") #self.lang["tab_2_title"]) # Add "tab2" to the tabs holder "tabs" 

        layout.addWidget(tab_holder)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

enter image description here

enter image description here

...