Rob Geraghty
Rob Geraghty

Reputation: 127

Add a QScrollBar to cramped QWidget in Python

Update on a previous question.

When displaying this looks very cramped, see photo below.

enter image description here

I would like to keep the QWidget (panel) the same height, and add a QScrollBar to the right of it, so the widgets go their natural size and the user can just scroll down

I tried adding this code in.

scroll = QtGui.QScrollArea()
scroll.setWidget(widget)
scroll.setWidgetResizable(True)
scroll.setFixedHeight(400)
layout.addWidget(scroll)

However the code runs, but no GUI even opens, so I to manually force stop it from the command line.

The working code is seen below.

Thanks

Rob

import sys
from PyQt4 import QtGui
from PySide import QtCore, QtGui
from scapy.all import *
from PySide.QtCore import *
from PySide.QtGui import *

app = QtGui.QApplication(sys.argv)
widget = QtGui.QWidget()
layout = QtGui.QGridLayout()
vbox1 = QtGui.QVBoxLayout()

button = QPushButton("Send")

flag1 = QCheckBox("CWR")
flag2 = QCheckBox("ECN")
flag3 = QCheckBox("URG")
flag4 = QCheckBox("ACK")
flag5 = QCheckBox("PSH")
flag6 = QCheckBox("RST")
flag7 = QCheckBox("SYN")
flag8 = QCheckBox("FIN")

textEdit1 = QtGui.QTextEdit('')
textEdit2 = QtGui.QTextEdit('')
textEdit3 = QtGui.QTextEdit('')
textEdit4 = QtGui.QTextEdit('')
#textEdit5 = QtGui.QTextEdit('')#using check boxes instead
textEdit6 = QtGui.QTextEdit('')

def buildTCPPanal():
    label1 = QtGui.QLabel("IP Destanation Address")
    label2 = QtGui.QLabel("IP Source Address")
    label3 = QtGui.QLabel("Source Port")
    label4 = QtGui.QLabel("Destanation Port")
    label5 = QtGui.QLabel("Flags")
    label6 = QtGui.QLabel("Data")

    layout.addWidget(label1) #dest add
    layout.addWidget(textEdit1)

    layout.addWidget(label2) #src add
    layout.addWidget(textEdit2)

    layout.addWidget(label3) #src port
    layout.addWidget(textEdit3)

    layout.addWidget(label4) #dest port
    layout.addWidget(textEdit4)

    layout.addWidget(label5) #flags
    layout.addWidget(flag1)
    layout.addWidget(flag2)
    layout.addWidget(flag3)
    layout.addWidget(flag4)
    layout.addWidget(flag5)
    layout.addWidget(flag6)
    layout.addWidget(flag7)
    layout.addWidget(flag8)


    layout.addWidget(label6)
    layout.addWidget(textEdit6)

    runCommandButton = QPushButton("Send Packet")
    runCommandButton.setObjectName("runCommandButton")

    vbox1.addLayout(layout)
    vbox1.addWidget(runCommandButton)
    #QtCore.QObject.connect(runCommandButton, QtCore.SIGNAL("clicked()"), createScapyCommand)

    widget.setLayout(vbox1)
    widget.show()
    sys.exit(app.exec_())


buildTCPPanal()

Upvotes: 0

Views: 220

Answers (1)

eyllanesc
eyllanesc

Reputation: 243907

You must create a new widget where you place the QScrollArea, and display that new widget. Also it is not good to combine elements of PyQt4 with PySide. And another bad practice is to use elements in a function that are outside that scope.

from PyQt4 import QtGui, QtCore
import sys

app = QtGui.QApplication(sys.argv)


def buildTCPPanal():
    widget = QtGui.QWidget()
    layout = QtGui.QGridLayout()
    vbox1 = QtGui.QVBoxLayout()

    button = QtGui.QPushButton("Send")

    flag1 = QtGui.QCheckBox("CWR")
    flag2 = QtGui.QCheckBox("ECN")
    flag3 = QtGui.QCheckBox("URG")
    flag4 = QtGui.QCheckBox("ACK")
    flag5 = QtGui.QCheckBox("PSH")
    flag6 = QtGui.QCheckBox("RST")
    flag7 = QtGui.QCheckBox("SYN")
    flag8 = QtGui.QCheckBox("FIN")

    textEdit1 = QtGui.QTextEdit('')
    textEdit2 = QtGui.QTextEdit('')
    textEdit3 = QtGui.QTextEdit('')
    textEdit4 = QtGui.QTextEdit('')
    #textEdit5 = QtGui.QTextEdit('')#using check boxes instead
    textEdit6 = QtGui.QTextEdit('')

    label1 = QtGui.QLabel("IP Destanation Address")
    label2 = QtGui.QLabel("IP Source Address")
    label3 = QtGui.QLabel("Source Port")
    label4 = QtGui.QLabel("Destanation Port")
    label5 = QtGui.QLabel("Flags")
    label6 = QtGui.QLabel("Data")

    layout.addWidget(label1) #dest add
    layout.addWidget(textEdit1)

    layout.addWidget(label2) #src add
    layout.addWidget(textEdit2)

    layout.addWidget(label3) #src port
    layout.addWidget(textEdit3)

    layout.addWidget(label4) #dest port
    layout.addWidget(textEdit4)

    layout.addWidget(label5) #flags
    layout.addWidget(flag1)
    layout.addWidget(flag2)
    layout.addWidget(flag3)
    layout.addWidget(flag4)
    layout.addWidget(flag5)
    layout.addWidget(flag6)
    layout.addWidget(flag7)
    layout.addWidget(flag8)


    layout.addWidget(label6)
    layout.addWidget(textEdit6)

    runCommandButton = QtGui.QPushButton("Send Packet")
    runCommandButton.setObjectName("runCommandButton")

    vbox1.addLayout(layout)
    vbox1.addWidget(runCommandButton)
    #QtCore.QObject.connect(runCommandButton, QtCore.SIGNAL("clicked()"), createScapyCommand)

    widget.setLayout(vbox1)
    widget.show()

    w = QtGui.QWidget()
    layout = QtGui.QVBoxLayout(w)
    scroll = QtGui.QScrollArea()

    scroll.setWidget(widget)
    scroll.setWidgetResizable(True)
    scroll.setFixedHeight(400)
    layout.addWidget(scroll) 
    w.show()

    sys.exit(app.exec_())


buildTCPPanal()

enter image description here

Upvotes: 1

Related Questions