Найти - Пользователи
Полная версия: Указать позиции виджета в пикселях
Начало » GUI » Указать позиции виджета в пикселях
1 2
Gooman
Можно ли указывать позиции виджетов в пикселях? Я совсем не понимаю, как можно реализовать тот интерфейс, который мне нужен, средствами grid и layout. Я просто трачу все время на поиск решений для создания интерфейса, а не на программирование функциональности. Кто придумал позиционировать этими гридами? Я просто хочу указать позиции в пикселях.

Я сначала пытался использовать Qt Designer и нечто подобное ему. Я даже их средствами с использованием этих гридов не мог интерфейс создать. Все куда-то разъезжается, label прямо над текстовым полем не ставится.
Gooman
Вот такой вот интерфейс или что-то подобное у кого-то есть?
Alen

Gooman
Можно ли указывать позиции виджетов в пикселях?

Можно.

Gooman
Я просто трачу все время на поиск решений для создания интерфейса, а не на программирование функциональности.

Не потратив хотя бы часа времени на обучение, нечего писать функциональность.

Gooman
Кто придумал позиционировать этими гридами?

Умные люди, которые знают что мониторы у всех разные, шрифты разные, зрение разное.

Gooman
Вот такой вот интерфейс или что-то подобное у кого-то есть?

Элементарно же, представьте что это все ваше окно это таблица, пронумеруйте все ячейки с номерами по вертикали и горизонтали. Расставьте все элеметны по этим ячейкам, некоторые виджеты могут занимать 2 и более ячеек. Осталось окну присвоить основной виджет QtGui.QGridLayout(),
а в него добавить основные ваши элементы/виджеты с номерами их позиции.
Пример:
from PyQt4 import QtGui, QtCore
class Window(QtGui.QWidget):
    """Main widget."""
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.grid = QtGui.QGridLayout(self)
        self.add = QtGui.QPushButton('Add')
        self.delete = QtGui.QPushButton('Delete')
        # ... объявление кучи ваших виджетов
        # ...
        self.grid.addWidget(self.add, 0, 0)  # верх окна слева
        self.grid.addWidget(self.delete, 0, 1) # верх окна правее
        # ...
Gooman
У меня есть интерфейс, в котором сделано все, кроме правой части того, что изображено на картинке. Если что-то добавлять правее, то оно добавляется не так, как изображено на картинке, а криво. Буду в пикселях все указывать. Все хорошо, если использовать указание, сколько ячеек будет занимать ListView по вертикали, но из-за этого увеличивается расстояние от label сверху этих ListView до самих ListView. Очень удобно, да.

Я это уже тут описывал: http://stackoverflow.com/questions/23567802/python-pyqt-widget-positioning-in-grid
Singularity
Alen
Gooman
Если что-то добавлять правее, то оно добавляется не так, как изображено на картинке, а криво.

http://pyqt.sourceforge.net/Docs/PyQt4/qboxlayout.html#addStretch

addStretch

http://habrahabr.ru/post/31687/
vrabey
Gooman
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore
class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.Centr = QtGui.QWidget()
        self.setCentralWidget(self.Centr)
        self.resize(800, 400)
        self.setWindowTitle('mainwindow')
        self.statusBar()
# --------- BoxLayout ---------
# основной контейнер
        base_h_layout = QtGui.QHBoxLayout()
        base_h_layout.addWidget(self.list_view_box(1), stretch=4)
        base_h_layout.addWidget(self.list_view_box(2), stretch=4)
        base_h_layout.addLayout(self.right_labels_box(), stretch=3)
        base_h_layout.setSpacing(2)
        base_h_layout.setMargin(10)  
        self.Centr.setLayout(base_h_layout)
 
    def list_view_box(self, arg):
        """
        принимает arg - название listview
        возвращает виджет-контейнер QGroupBox        
        """
        box = QtGui.QGroupBox("some text {0}".format(arg))
        vbox = QtGui.QVBoxLayout(box)
        list_view =  QtGui.QListWidget()
        button = QtGui.QPushButton("button {0}".format(arg))
        vbox.addWidget(list_view)
        vbox.addWidget(button)
        return box
        
     
    def right_labels_box(self):
        """
        возвращает контейнер - QVBoxLayout
        """
        
        vbox_layout = QtGui.QVBoxLayout()
# первая надпись
        label_1 = QtGui.QLabel("-------")
        label_1.setStyleSheet('background-color: {0};'.format('#ffffff'))
        label_1.setAlignment(QtCore.Qt.AlignHCenter)
        form_1 = QtGui.QFormLayout()
        form_1.addRow("label 1:", label_1)
        form_1.setRowWrapPolicy(QtGui.QFormLayout.WrapAllRows)
# вторая надпись
        label_2 = QtGui.QLabel("-------")
        label_2.setStyleSheet('background-color: {0};'.format('#ffffff'))
        label_2.setAlignment(QtCore.Qt.AlignHCenter)
        form_2 = QtGui.QFormLayout()
        form_2.addRow("label 2:", label_2)
        form_2.setRowWrapPolicy(QtGui.QFormLayout.WrapAllRows)
        vbox_layout.addLayout(form_1)
        vbox_layout.addLayout(form_2)
        vbox_layout.addStretch(stretch=2)
        return vbox_layout
        
app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())

получилось примерно так

Alen
Не потратив хотя бы часа времени на обучение, нечего писать функциональность.
а это правда
Alen
# -*- coding: utf8 -*-
from PyQt4 import QtGui, QtCore
class Window(QtGui.QWidget):
    """Main widget."""
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.horizontal = QtGui.QHBoxLayout(self)
        self.one_layout = QtGui.QVBoxLayout()
        self.tile_one = QtGui.QLabel('one')
        self.listview_one = QtGui.QListView()
        self.button_one = QtGui.QPushButton('one')
        self.one_layout.addWidget(self.tile_one)
        self.one_layout.addWidget(self.listview_one)
        self.one_layout.addWidget(self.button_one)
        #
        #
        self.two_layout = QtGui.QVBoxLayout()
        self.title_two = QtGui.QLabel('two')
        self.listview_two = QtGui.QListView()
        self.button_two = QtGui.QPushButton('two')
        self.two_layout.addWidget(self.title_two)
        self.two_layout.addWidget(self.listview_two)
        self.two_layout.addWidget(self.button_two)
       #
       #
        self.three_layout = QtGui.QVBoxLayout()
        self.label_one = QtGui.QLabel('One Label')
        self.edit_one = QtGui.QLineEdit()
        self.label_two = QtGui.QLabel('Two Label')
        self.edit_two = QtGui.QLineEdit()
        self.three_layout.addWidget(self.label_one)
        self.three_layout.addWidget(self.edit_one)
        self.three_layout.addWidget(self.label_two)
        self.three_layout.addWidget(self.edit_two)
        self.three_layout.addStretch(1)
        #
        #
        self.horizontal.addLayout(self.one_layout)
        self.horizontal.addLayout(self.two_layout)
        self.horizontal.addLayout(self.three_layout)
#
#
if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    myapp = Window()
    myapp.show()
    sys.exit(app.exec_())

Gooman
Как добавить слой шириной на все окно под всеми объектами окна? Это мне для статуса нужно. Знаю, что colspan можно задавать в Grid, когда вызывается метод addWidget. Для QVBoxLayout метод addWidget другой.
vrabey
Gooman
Как добавить слой шириной на все окно под всеми объектами окна
в QMainWindow есть готовый статус бар
vrabey
self.statusBar()
http://wiki.python.su/%D0%94%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D0%B8/%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%D0%92%D0%A1%D1%80%D0%B5%D0%B4%D1%83PyQt4#A.2BBB8EMAQ9BDUEOwRM_.2BBEEEPgRBBEIEPgRPBD0EOARP-

а чтобы добавить например виджет внизу в данном случае действительно надо создать QVBoxLayout
а в него добавить всё остальное
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB