Gianni Spear
Gianni Spear

Reputation: 8010

alignment buttons in PyQt4 of Python

This is my first application using PyQt4.

I have the following two problems

enter image description here

  1. the Buttons on left box. They have not the same spacing.

  2. Is it possible use italics for the radio buttons? (i.e., Ke et al. instead of Ke et al.)?

import sys from PyQt4 import QtGui, QtCore

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        # title of the window
        self.setWindowTitle('Segmentation Accuracy')
        # fix window size
        self.setFixedSize(400,200)
        # status bar with initial message
        self.statusBar().showMessage('ready')


        # Layout
        # contiene gli altri widget
        cWidget = QtGui.QWidget(self)
        grid = QtGui.QGridLayout(cWidget) 


        # Box Left
        vBox_left = QtGui.QVBoxLayout()
        vBox_left.setSpacing(2) #set spacing

        Button_input1 = QtGui.QPushButton("Reference Polygons")
        vBox_left.addWidget(Button_input1)

        Button_input2 = QtGui.QPushButton("Segmented Polygons")
        vBox_left.addWidget(Button_input2)

        Button_output = QtGui.QPushButton("Save")
        vBox_left.addWidget(Button_output)

        Button_start = QtGui.QPushButton("Start")
        Button_start.setCheckable(True)

        vBox_left.addWidget(Button_input1)
        vBox_left.addWidget(Button_input2)
        vBox_left.addWidget(Button_output)
        vBox_left.addWidget(Button_start)

        # Box right
        vBox_rigth = QtGui.QVBoxLayout()
        vBox_rigth.setSpacing(10) #set spacing
        ke = QtGui.QRadioButton("Ke et al.", cWidget)
        pu = QtGui.QRadioButton("Pu et al.", cWidget)
        clinton = QtGui.QRadioButton("Clinton et al.", cWidget)
        ke.setChecked(True)
        vBox_rigth.addWidget(ke)
        vBox_rigth.addWidget(pu)
        vBox_rigth.addWidget(clinton)

        ke.setStatusTip("Ke et al., 2010. Remote Sensing of Environment, 114, pp. 1141-1154")
        pu.setStatusTip("Pu et al., 2012. Remote Sensing of Environment, 124, pp. 516-533")
        clinton.setStatusTip("Clinton et al., 2012. Remote Sensing of Environment, 124, pp. 516-533")

        grid.addWidget(Button_input1, 0, 0)
        grid.addWidget(Button_input2, 1, 0)
        grid.addWidget(Button_output, 2, 0)
        grid.addWidget(Button_start, 3, 0)
        grid.addLayout(vBox_left, 0, 0)
        grid.addLayout(vBox_rigth, 0, 1)


        cWidget.setLayout(grid)
        self.setCentralWidget(cWidget)

def main():
    app = QtGui.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())

main()

Upvotes: 2

Views: 4722

Answers (1)

nymk
nymk

Reputation: 3393

You used QGridLayout and put Button_input1 into cell (0,0) and the layout vBox_rigth containing three raido buttons into cell (0,1). They were resized to the same height. That's why your four buttons don't have the same spacing.

    grid = QtGui.QGridLayout(cWidget)
    ......
    grid.addWidget(Button_input1, 0, 0)
    ......
    grid.addLayout(vBox_rigth, 0, 1)

You should not use addWidget to add those buttons to vBox_left twice.


    Button_input1 = QtGui.QPushButton("Reference Polygons")
    vBox_left.addWidget(Button_input1)

    Button_input2 = QtGui.QPushButton("Segmented Polygons")
    vBox_left.addWidget(Button_input2)

    Button_output = QtGui.QPushButton("Save")
    vBox_left.addWidget(Button_output)

    Button_start = QtGui.QPushButton("Start")
    Button_start.setCheckable(True)

    vBox_left.addWidget(Button_input1)
    vBox_left.addWidget(Button_input2)
    vBox_left.addWidget(Button_output)
    vBox_left.addWidget(Button_start)

Moreover, these four buttons have already been added to QVBoxLayout vBox_left, then you should not add them to grid.

    grid.addWidget(Button_input1, 0, 0)
    grid.addWidget(Button_input2, 1, 0)
    grid.addWidget(Button_output, 2, 0)
    grid.addWidget(Button_start, 3, 0)

You can use italics for widgets. You just need to change the font property. See http://doc.qt.digia.com/stable/qwidget.html#font-prop.
For example:

    ke = QtGui.QRadioButton("Ke et al.", cWidget)
    font = QtGui.QFont("Times", 10)
    font.setItalic(True)
    ke.setFont(font)

You can also use QLabel to display rich text. For instance:

    ke_label = QtGui.QLabel("Ke <i>et al</i>.")

Thus, the final __init__ would probably be

    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        # title of the window
        self.setWindowTitle('Segmentation Accuracy')
        # fix window size
        self.setFixedSize(400,200)
        # status bar with initial message
        self.statusBar().showMessage('ready')


        # Layout
        # contiene gli altri widget
        cWidget = QtGui.QWidget(self)
        grid = QtGui.QGridLayout(cWidget)

        # Box Left
        vBox_left = QtGui.QVBoxLayout()
        vBox_left.setSpacing(2) #set spacing

        Button_input1 = QtGui.QPushButton("Reference Polygons")
        vBox_left.addWidget(Button_input1)

        Button_input2 = QtGui.QPushButton("Segmented Polygons")
        vBox_left.addWidget(Button_input2)

        Button_output = QtGui.QPushButton("Save")
        vBox_left.addWidget(Button_output)

        Button_start = QtGui.QPushButton("Start")
        Button_start.setCheckable(True)

        # vBox_left.addWidget(Button_input1)
        # vBox_left.addWidget(Button_input2)
        # vBox_left.addWidget(Button_output)
        vBox_left.addWidget(Button_start)

        # Box right
        vBox_right = QtGui.QVBoxLayout()
        vBox_right.setSpacing(10) #set spacing

        ke = QtGui.QRadioButton("", cWidget)
        pu = QtGui.QRadioButton("", cWidget)
        clinton = QtGui.QRadioButton("", cWidget)
        ke.setChecked(True)

        ke_label = QtGui.QLabel("Ke <i>et al</i>.", cWidget)
        pu_label = QtGui.QLabel("Pu et al.", cWidget)
        clinton_label = QtGui.QLabel("Clinton et al.", cWidget)

        grid_right = QtGui.QGridLayout()

        grid_right.addWidget(ke, 0, 0)
        grid_right.addWidget(pu, 1, 0)
        grid_right.addWidget(clinton, 2, 0)
        grid_right.addWidget(ke_label, 0, 1)
        grid_right.addWidget(pu_label, 1, 1)
        grid_right.addWidget(clinton_label, 2, 1)
        grid.addLayout(grid_right, 0, 1)

        grid.setColumnStretch(0, 1)
        grid.setColumnStretch(1, 1)
        grid_right.setColumnStretch(1, 1)

        ke.setStatusTip("Ke et al., 2010. Remote Sensing of Environment, 114, pp. 1141-1154")
        pu.setStatusTip("Pu et al., 2012. Remote Sensing of Environment, 124, pp. 516-533")
        clinton.setStatusTip("Clinton et al., 2012. Remote Sensing of Environment, 124, pp. 516-533")


        ke_label.setStatusTip("Ke et al., 2010. Remote Sensing of Environment, 114, pp. 1141-1154")
        pu_label.setStatusTip("Pu et al., 2012. Remote Sensing of Environment, 124, pp. 516-533")
        clinton_label.setStatusTip("Clinton et al., 2012. Remote Sensing of Environment, 124, pp. 516-533")

        # grid.addWidget(Button_input1, 0, 0)
        # grid.addWidget(Button_input2, 1, 0)
        # grid.addWidget(Button_output, 2, 0)
        # grid.addWidget(Button_start, 3, 0)
        grid.addLayout(vBox_left, 0, 0)
        #grid.addLayout(vBox_right, 0, 1)


        # cWidget.setLayout(grid)
        self.setCentralWidget(cWidget)

Upvotes: 2

Related Questions