I'm unfamiliar with PyQt and QColumnView, how do I make it so that we get a "description" of whatever the user selects and not another row of items that I can click on extending the column view?
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(423, 390)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.add_btn = QtWidgets.QPushButton(self.centralwidget)
self.add_btn.setGeometry(QtCore.QRect(334, 345, 75, 23))
self.add_btn.setObjectName("add_btn")
self.auto_btn = QtWidgets.QPushButton(self.centralwidget)
self.auto_btn.setGeometry(QtCore.QRect(245, 345, 81, 23))
self.auto_btn.setObjectName("auto_btn")
self.auto_num = QtWidgets.QLineEdit(self.centralwidget)
self.auto_num.setGeometry(QtCore.QRect(141, 346, 99, 20))
self.auto_num.setText("")
self.auto_num.setClearButtonEnabled(False)
self.auto_num.setObjectName("auto_num")
self.columnView = QtWidgets.QColumnView(self.centralwidget)
self.columnView.setGeometry(QtCore.QRect(10, 10, 399, 320))
self.columnView.setObjectName("columnView")
model = QtGui.QStandardItemModel()
for i in 'abcd':
group = QtGui.QStandardItem(i)
model.appendRow(group)
self.columnView.setModel(model)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.add_btn.setText(_translate("MainWindow", "Add Item"))
self.auto_btn.setText(_translate("MainWindow", "Auto-populate"))
this is how i want it to appear
I don't need to use QColumnView, just QListView + QTextEdit and associate a role for the description, so when the selection changes, change the text shown in the QTextEdit.
from PyQt5 import QtCore, QtGui, QtWidgets
DescriptionRole = QtCore.Qt.UserRole + 1000
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.listview = QtWidgets.QListView()
self.textedit = QtWidgets.QTextEdit(readOnly=True)
self.model = QtGui.QStandardItemModel()
self.listview.setModel(self.model)
data = [
("a", "description of 'a'"),
("b", "description of 'b'"),
("c", "description of 'c'"),
("d", "description of 'd'"),
]
for text, description in data:
group = QtGui.QStandardItem(text)
group.setData(description, DescriptionRole)
self.model.appendRow(group)
self.listview.selectionModel().selectionChanged.connect(
self.on_selection_changed
)
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
hlay = QtWidgets.QHBoxLayout(central_widget)
hlay.addWidget(self.listview)
hlay.addWidget(self.textedit)
#QtCore.pyqtSlot()
def on_selection_changed(self):
indexes = self.listview.selectedIndexes()
if indexes:
index = indexes[0]
description = index.data(DescriptionRole)
self.textedit.setPlainText(description)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Related
I want to make that, when I press the plus, another same form is made.
The second form appeared but the first form was lost
I need help when I keep the first one and add the others below
from zlib import DEF_BUF_SIZE
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(459, 288)
self.y=15
self.x=20
self.i=0
self.rep(self.y, self.x)
self.retranslateUi(MainWindow)
#QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
def rep(self,x,y):
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("../../../Downloads/Hopstarter-Button-Button-Add.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget" + str(self.i))
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(30, x, 200, 30))
font = QtGui.QFont()
font.setPointSize(14)
font.setWeight(75)
self.lineEdit.setFont(font)
self.lineEdit.setObjectName("lineEdit")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(250, y, 75, 23))
self.pushButton.setText("")
self.pushButton.setIcon(icon)
self.pushButton.setIconSize(QtCore.Size(21, 21))
self.pushButton.setDefault(True)
self.pushButton.setObjectName("pushButton")
self.pushButton.clicked.connect(self.onOne)
MainWindow.setCentralWidget(self.centralwidget)
pass
def onOne(self):
self.y +=30
self.x +=30
self.i += 1
self.rep(self.y, self.x)
pass
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
I tried the first suggestion and it didn't work. I listened to another suggestion. He modified something of his own, and it works
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QWidget, QPushButton,
QHBoxLayout, QVBoxLayout, QApplication)
class Ui_MainWindow(QWidget):
def __init__(self):
super().__init__()
self.vbox = QVBoxLayout()
self.setupUi()
def setupUi(self):
self.hbox = QHBoxLayout()
self.lineEdit = self.lab()
self.hbox.addWidget(self.lineEdit)
self.hbox.addStretch()
self.pushButton = self.butt()
self.hbox.addWidget(self.pushButton)
self.vbox.addLayout(self.hbox)
self.setLayout(self.vbox)
self.pushButton.clicked.connect(self.klik)
def klik(self):
s = self.lineEdit.text()
if (len(s.strip())!=0):
self.pushButton.setEnabled(False)
self.setupUi()
pass
def f(self):
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
return font
def i(self):
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("../../../Users/Downloads/Hopstarter-Button-Button-Add.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
return icon
def butt(self):
pushButton = QtWidgets.QPushButton()
ff = self.f()
pushButton.setFont(ff)
pushButton.setLayoutDirection(QtCore.Qt.LeftToRight)
pushButton.setText("")
ii = self.i()
pushButton.setIcon(ii)
pushButton.setIconSize(QtCore.QSize(21, 21))
pushButton.setAutoDefault(True)
pushButton.setDefault(True)
pushButton.setFlat(True)
pushButton.setObjectName("pushButton")
return pushButton
def lab(self):
lineEdit = QtWidgets.QLineEdit()
ff = self.f()
lineEdit.setFont(ff)
lineEdit.setObjectName("lineEdit")
return lineEdit
if name == "main":
import sys
app = QtWidgets.QApplication(sys.argv)
ui = Ui_MainWindow()
ui.show()
sys.exit(app.exec_())
I want to make a sport team managing program but I am stuck on this one part. On playertabs.py your supposed to be able to add a new player with a button, this pop up a second window (NewPlayers.py) with the details that needs to be entered. When hitting the add player button the second window (NewPlayers.py) needs to close and all entered information should be saved on the players name that they entered on the playertabs.py window in the form of a list. Multiple players must be added this way.
Main.py codes:
import sys
from PyQt5.uic import loadUi
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QDialog, QApplication, QMainWindow
from NewPlayers import Ui_Dialog
#PlayersTab screen
class PlayersTab(QMainWindow):
def __init__(self):
super(PlayersTab, self).__init__()
loadUi("playerstab.ui", self)
self.addnewplayer.clicked.connect(self.openNewPlayers)
#Go to NewPlayers screen
def openNewPlayers(self):
self.window = QtWidgets.QDialog()
self.ui = Ui_Dialog()
self.ui.setupUi(self.window)
self.window.show()
#Go to PlayerTab screen
def gotoPlayersTab(self):
widget.setCurrentIndex(widget.currentIndex() + 1)
# main
app = QApplication(sys.argv)
widget = QtWidgets.QStackedWidget()
playerstab = PlayersTab()
widget.addWidget(playerstab)
widget.setFixedHeight(480)
widget.setFixedWidth(640)
widget.show()
try:
sys.exit(app.exec_())
except:
print("Exiting")
playertab.py code:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(640, 480)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.addnewplayer = QtWidgets.QPushButton(self.centralwidget)
self.addnewplayer.setGeometry(QtCore.QRect(450, 50, 181, 31))
self.addnewplayer.setObjectName("addnewplayer")
self.playerlist = QtWidgets.QListWidget(self.centralwidget)
self.playerlist.setGeometry(QtCore.QRect(0, 90, 630, 380))
self.playerlist.setObjectName("playerlist")
self.matches = QtWidgets.QPushButton(self.centralwidget)
self.matches.setGeometry(QtCore.QRect(10, 50, 181, 31))
self.matches.setObjectName("matches")
self.searchplayer = QtWidgets.QLineEdit(self.centralwidget)
self.searchplayer.setGeometry(QtCore.QRect(10, 10, 621, 31))
self.searchplayer.setObjectName("searchplayer")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.addnewplayer.setText(_translate("MainWindow", "Add new player"))
self.matches.setText(_translate("MainWindow", "Matches"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
NewPlayer.py code:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(640, 480)
self.addPhoto = QtWidgets.QPushButton(Dialog)
self.addPhoto.setGeometry(QtCore.QRect(10, 410, 100, 50))
font = QtGui.QFont()
font.setPointSize(11)
self.addPhoto.setFont(font)
self.addPhoto.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
self.addPhoto.setObjectName("addPhoto")
self.p_name = QtWidgets.QLineEdit(Dialog)
self.p_name.setEnabled(True)
self.p_name.setGeometry(QtCore.QRect(400, 36, 200, 44))
self.p_name.setObjectName("p_name")
self.p_prfname = QtWidgets.QLineEdit(Dialog)
self.p_prfname.setGeometry(QtCore.QRect(400, 80, 200, 44))
self.p_prfname.setObjectName("p_prfname")
self.p_height = QtWidgets.QLineEdit(Dialog)
self.p_height.setGeometry(QtCore.QRect(400, 168, 200, 44))
self.p_height.setObjectName("p_height")
self.p_nr = QtWidgets.QLineEdit(Dialog)
self.p_nr.setGeometry(QtCore.QRect(400, 212, 200, 44))
self.p_nr.setObjectName("p_nr")
self.p_placeob = QtWidgets.QLineEdit(Dialog)
self.p_placeob.setGeometry(QtCore.QRect(400, 256, 200, 44))
self.p_placeob.setObjectName("p_placeob")
self.p_weight = QtWidgets.QLineEdit(Dialog)
self.p_weight.setGeometry(QtCore.QRect(400, 300, 200, 44))
self.p_weight.setObjectName("p_weight")
self.back = QtWidgets.QPushButton(Dialog)
self.back.setGeometry(QtCore.QRect(280, 410, 100, 50))
font = QtGui.QFont()
font.setPointSize(11)
self.back.setFont(font)
self.back.setObjectName("back")
#addplayer Button
self.addPlayer = QtWidgets.QPushButton(Dialog, clicked=lambda: self.savePlayer())
self.addPlayer.setGeometry(QtCore.QRect(520, 410, 100, 50))
font = QtGui.QFont()
font.setPointSize(11)
self.addPlayer.setFont(font)
self.addPlayer.setObjectName("addPlayer")
self.p_dob = QtWidgets.QLineEdit(Dialog)
self.p_dob.setGeometry(QtCore.QRect(400, 124, 200, 44))
self.p_dob.setObjectName("p_dob")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def savePlayer(self):
# blank list to hold player info
playerInfo = []
# loop through data and pull out each info
playerInfo.append(self.p_name)
playerInfo.append(self.p_prfname)
playerInfo.append(self.p_dob)
playerInfo.append(self.p_height)
playerInfo.append(self.p_nr)
playerInfo.append(self.p_placeob)
playerInfo.append(self.p_weight)
p_name = self.p_name.text()
print(p_name)
# close window
# NewPlayers.close()
from playerstab import Ui_MainWindow
# self.ui.playerlist.addItem(player)
from Main import PlayersTab
from Main import widget
playerstab = PlayersTab()
widget.addWidget(playerstab)
widget.setCurrentIndex(widget.currentIndex()+1)
#add player
player = p_name
playerstab.playerlist.addItem(player)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "CourseWork"))
self.addPhoto.setText(_translate("Dialog", "Add Photo"))
self.p_name.setText(_translate("Dialog", "Full name & Surname"))
self.p_prfname.setText(_translate("Dialog", "Preferred Name"))
self.p_height.setText(_translate("Dialog", "Height"))
self.p_nr.setText(_translate("Dialog", "Cellphone number"))
self.p_placeob.setText(_translate("Dialog", "Place of Birth"))
self.p_weight.setText(_translate("Dialog", "Weight"))
self.back.setText(_translate("Dialog", "Back"))
self.addPlayer.setText(_translate("Dialog", "Add Player"))
self.p_dob.setText(_translate("Dialog", "Date of Birth (DD/MM/YY)"))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
The following code creates 7 tabs each from a different tab class. When it runs, all tabs are created and it opens with tab 1 selected. Once another tab is clicked, Tab 1 can never be opened again. Tab 2 sometimes can be opened, but most of the time not. All the other tabs can be opened at any time. Can any anyone tell me what I am doing wrong?
If I use a single class, create the different creation methods from within this class, and then call each method everything works.
The reason I want to use classes for the tabs is two fold. 1) there will be 10 tabs and each tab will have lots of widgets causing a very long file and 2) I want to be able to use Native Language Services (NLS).
import sys
from PyQt5.QtCore import (QMetaObject )
from PyQt5.QtWidgets import (QPushButton, QMainWindow,
QHBoxLayout, QApplication, QTabWidget,
QMenuBar, QStatusBar)
from Tab1 import *
from Tab2 import *
from Tab3 import *
class Ui_NFPCinput(QWidget):
def __init__(self):
super().__init__()
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1000, 1000)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayoutWidget = QWidget(self.centralwidget)
self.horizontalLayoutWidget.setGeometry(QRect(0, 0, 990, 800))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.horizontalLayoutWidget_2 = QWidget(self.centralwidget)
self.horizontalLayoutWidget_2.setGeometry(QRect(300, 930, 641, 41))
self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
self.horizontalLayout_2 = QHBoxLayout(self.horizontalLayoutWidget_2)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.GetFile = QPushButton(self.horizontalLayoutWidget_2)
self.GetFile.setObjectName("GetFile")
self.horizontalLayout_2.addWidget(self.GetFile)
self.CancelButton = QPushButton(self.horizontalLayoutWidget_2)
self.CancelButton.setObjectName("CancelButton")
self.horizontalLayout_2.addWidget(self.CancelButton)
self.OkButton = QPushButton(self.horizontalLayoutWidget_2)
self.OkButton.setObjectName("OkButton")
self.horizontalLayout_2.addWidget(self.OkButton)
self.tabWidget = QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QRect(10, 10, 980, 900))
self.tabWidget.setObjectName("tabWidget")
self.tab0 = Tab1(self.tabWidget)
self.tabWidget.addTab(self.tab0.getTab(), "")
self.tab1 = Tab2(self.tabWidget)
self.tabWidget.addTab(self.tab1.getTab(), "")
self.tab2 = Tab3(self.tabWidget)
self.tabWidget.addTab(self.tab2.getTab(), "")
self.tab3 = Tab1(self.tabWidget)
self.tabWidget.addTab(self.tab3.getTab(), "")
self.tab4 = Tab2(self.tabWidget)
self.tabWidget.addTab(self.tab4.getTab(), "")
self.tab5 = Tab3(self.tabWidget)
self.tabWidget.addTab(self.tab5.getTab(), "")
self.tab6 = Tab1(self.tabWidget)
self.tabWidget.addTab(self.tab6.getTab(), "")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setGeometry(QRect(0, 0, 649, 27))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Tabs Test"))
self.CancelButton.setText(_translate("MainWindow", "OK"))
self.OkButton.setText(_translate("MainWindow", "Cancel"))
self.GetFile.setText(_translate("MainWindow", "Test"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab0.getTab()), _translate("MainWindow", "Tab 0"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab1.getTab()), _translate("MainWindow", "Tab 1"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab2.getTab()), _translate("MainWindow", "Tab 2"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab3.getTab()), _translate("MainWindow", "Tab 3"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab4.getTab()), _translate("MainWindow", "Tab 4"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab5.getTab()), _translate("MainWindow", "Tab 5"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab6.getTab()), _translate("MainWindow", "Tab 6"))
if __name__ == "__main__":
app = QApplication(sys.argv)
MainWindow = QMainWindow()
ui = Ui_NFPCinput()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
The template for the tab classes, just change the tab number
from PyQt5.QtCore import QRect, QCoreApplication
from PyQt5.QtWidgets import QWidget, QLabel
class Tab1(QWidget):
def __init__(self, parent):
super(QWidget, self).__init__(parent)
self.tab = QWidget()
self.tab.setObjectName("Tab1")
self.label = QLabel(self.tab)
self.label.setGeometry(QRect(20, 10, 200, 19))
self.label.setObjectName("label")
self.label.setText("")
self.retranslateUi()
def getTab(self):
return self.tab
def retranslateUi(self):
_translate = QCoreApplication.translate
self.label.setText(_translate( "MainTab","This is Object 1"))
The problem is in your Tab1. You've got an extra level of widgets.
from PyQt5.QtCore import QRect, QCoreApplication
from PyQt5.QtWidgets import QWidget, QLabel
class Tab1(QWidget):
def __init__(self, parent):
super(QWidget, self).__init__(parent)
# self.tab = QWidget()
# self.tab.setObjectName("Tab1")
self.setObjectName("Tab1")
# self.label = QLabel(self.tab)
self.label = QLabel(self)
self.label.setGeometry(QRect(20, 10, 200, 19))
self.label.setObjectName("label")
self.label.setText("")
self.retranslateUi()
def getTab(self):
# return self.tab
return self
def retranslateUi(self):
_translate = QCoreApplication.translate
self.label.setText(_translate( "MainTab","This is Object 1"))
Correction: Changed the line
super(QWidget, self).__init__(parent)
to
super(QWidget, self).__init__()
This worked.
I have two windows, first window is 'FirstWindow' and second is 'Calendar'. first window has one push button (pbSelectDate) and one label (lbDate). calendar window has calendar (CalendarBox) and one push button (pbSelect).
when i click select (pbSelectDate) from first window, calendar window pops up. I select the date and press select button (pbSelect) in the calendar window. i want to print the selected date to the label (lbDate) in the first window.
thanks in advance. :)
this is the first window script.
from PyQt5 import QtCore, QtGui, QtWidgets
from Calendar import Ui_CalendarWindow
class Ui_FirstWindow(object):
def Open_Calendar(self):
self.window = QtWidgets.QMainWindow()
self.ui = Ui_CalendarWindow()
self.ui.setupUi(self.window)
self.window.show()
def setupUi(self, FirstWindow):
FirstWindow.setObjectName("FirstWindow")
FirstWindow.resize(654, 242)
self.centralwidget = QtWidgets.QWidget(FirstWindow)
self.centralwidget.setObjectName("centralwidget")
self.lbDate = QtWidgets.QLabel(self.centralwidget)
self.lbDate.setGeometry(QtCore.QRect(330, 70, 281, 131))
font = QtGui.QFont()
font.setPointSize(16)
font.setBold(True)
font.setWeight(75)
self.lbDate.setFont(font)
self.lbDate.setLayoutDirection(QtCore.Qt.LeftToRight)
self.lbDate.setObjectName("lbDate")
self.pbSelectDate = QtWidgets.QPushButton(self.centralwidget)
self.pbSelectDate.setGeometry(QtCore.QRect(80, 100, 191, 61))
self.pbSelectDate.setObjectName("pbSelectDate")
self.pbSelectDate.clicked.connect(self.Open_Calendar)
FirstWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(FirstWindow)
self.statusbar.setObjectName("statusbar")
FirstWindow.setStatusBar(self.statusbar)
self.retranslateUi(FirstWindow)
QtCore.QMetaObject.connectSlotsByName(FirstWindow)
def retranslateUi(self, FirstWindow):
_translate = QtCore.QCoreApplication.translate
FirstWindow.setWindowTitle(_translate("FirstWindow", "MainWindow"))
self.lbDate.setText(_translate("FirstWindow", "Sep"))
self.pbSelectDate.setText(_translate("FirstWindow", "Select Date"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
FirstWindow = QtWidgets.QMainWindow()
ui = Ui_FirstWindow()
ui.setupUi(FirstWindow)
FirstWindow.show()
sys.exit(app.exec_())
this is the Calendar window script..
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_CalendarWindow(object):
def PickedDate(self,var):
self.selecteddate = self.CalendarBox.selectedDate()
#print(self.selecteddate.toString('MMM')+'-'+self.selecteddate.toString('yyyy'))
def setupUi(self, CalendarWindow):
CalendarWindow.setObjectName("CalendarWindow")
CalendarWindow.resize(512, 458)
self.centralwidget = QtWidgets.QWidget(CalendarWindow)
self.centralwidget.setObjectName("centralwidget")
self.CalendarBox = QtWidgets.QCalendarWidget(self.centralwidget)
self.CalendarBox.setGeometry(QtCore.QRect(20, 20, 464, 289))
self.CalendarBox.setObjectName("CalendarBox")
self.pbSelect = QtWidgets.QPushButton(self.centralwidget)
self.pbSelect.setGeometry(QtCore.QRect(160, 330, 181, 60))
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.pbSelect.setFont(font)
self.pbSelect.setObjectName("pbSelect")
self.pbSelect.clicked.connect(self.PickedDate)
CalendarWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(CalendarWindow)
self.statusbar.setObjectName("statusbar")
CalendarWindow.setStatusBar(self.statusbar)
self.retranslateUi(CalendarWindow)
QtCore.QMetaObject.connectSlotsByName(CalendarWindow)
def retranslateUi(self, CalendarWindow):
_translate = QtCore.QCoreApplication.translate
CalendarWindow.setWindowTitle(_translate("CalendarWindow", "MainWindow"))
self.pbSelect.setText(_translate("CalendarWindow", "Select"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
CalendarWindow = QtWidgets.QMainWindow()
ui = Ui_CalendarWindow()
ui.setupUi(CalendarWindow)
CalendarWindow.show()
sys.exit(app.exec_())
Do not modify the code generated by Qt Designer but create another class that inherits from the appropriate widget and use the initial class to fill it.
QLabel.setText(const QString )
Setting the text clears any previous content.
from PyQt5 import QtCore, QtGui, QtWidgets
#from Calendar import Ui_CalendarWindow
class Ui_CalendarWindow(object):
def setupUi(self, CalendarWindow):
CalendarWindow.setObjectName("CalendarWindow")
CalendarWindow.resize(512, 458)
self.centralwidget = QtWidgets.QWidget(CalendarWindow)
self.centralwidget.setObjectName("centralwidget")
self.CalendarBox = QtWidgets.QCalendarWidget(self.centralwidget)
self.CalendarBox.setGeometry(QtCore.QRect(20, 20, 464, 289))
self.CalendarBox.setObjectName("CalendarBox")
self.pbSelect = QtWidgets.QPushButton(self.centralwidget)
self.pbSelect.setGeometry(QtCore.QRect(160, 330, 181, 60))
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.pbSelect.setFont(font)
self.pbSelect.setObjectName("pbSelect")
# self.pbSelect.clicked.connect(self.PickedDate)
CalendarWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(CalendarWindow)
self.statusbar.setObjectName("statusbar")
CalendarWindow.setStatusBar(self.statusbar)
self.retranslateUi(CalendarWindow)
QtCore.QMetaObject.connectSlotsByName(CalendarWindow)
def retranslateUi(self, CalendarWindow):
_translate = QtCore.QCoreApplication.translate
CalendarWindow.setWindowTitle(_translate("CalendarWindow", "MainWindow"))
self.pbSelect.setText(_translate("CalendarWindow", "Select"))
class Ui_FirstWindow(object):
def setupUi(self, FirstWindow):
FirstWindow.setObjectName("FirstWindow")
FirstWindow.resize(654, 242)
self.centralwidget = QtWidgets.QWidget(FirstWindow)
self.centralwidget.setObjectName("centralwidget")
self.lbDate = QtWidgets.QLabel(self.centralwidget)
self.lbDate.setGeometry(QtCore.QRect(330, 70, 281, 131))
font = QtGui.QFont()
font.setPointSize(16)
font.setBold(True)
font.setWeight(75)
self.lbDate.setFont(font)
self.lbDate.setLayoutDirection(QtCore.Qt.LeftToRight)
self.lbDate.setObjectName("lbDate")
self.pbSelectDate = QtWidgets.QPushButton(self.centralwidget)
self.pbSelectDate.setGeometry(QtCore.QRect(80, 100, 191, 61))
self.pbSelectDate.setObjectName("pbSelectDate")
# self.pbSelectDate.clicked.connect(self.Open_Calendar)
FirstWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(FirstWindow)
self.statusbar.setObjectName("statusbar")
FirstWindow.setStatusBar(self.statusbar)
self.retranslateUi(FirstWindow)
QtCore.QMetaObject.connectSlotsByName(FirstWindow)
def retranslateUi(self, FirstWindow):
_translate = QtCore.QCoreApplication.translate
FirstWindow.setWindowTitle(_translate("FirstWindow", "MainWindow"))
self.lbDate.setText(_translate("FirstWindow", "Sep"))
self.pbSelectDate.setText(_translate("FirstWindow", "Select Date"))
class CalendarWindow(QtWidgets.QMainWindow, Ui_CalendarWindow): # +
def __init__(self):
super(CalendarWindow, self).__init__()
self.setupUi(self)
class FirstWindow(QtWidgets.QMainWindow, Ui_FirstWindow): # +
def __init__(self):
super(FirstWindow, self).__init__()
self.setupUi(self)
self.pbSelectDate.clicked.connect(self.Open_Calendar)
def Open_Calendar(self):
self.window = CalendarWindow()
self.window.setupUi(self.window)
self.window.show()
self.window.pbSelect.clicked.connect(self.PickedDate)
def PickedDate(self): # , var
self.selecteddate = self.window.CalendarBox.selectedDate()
# print(self.selecteddate.toString('MMM')+'-'+self.selecteddate.toString('yyyy'))
self.lbDate.setText(self.selecteddate.toString('ddd-MMM-yyyy')) # <---
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = FirstWindow()
w.show()
sys.exit(app.exec_())
I have the QSplitter widget in my Qt5 GUI, and there are two child widgets added to that splitter. and there is a QPushButton widget, when that button is pushed second child disappears and when again that button is pushed that child widget appears. but I want like expanding and collapsing of that child widget. but I have no idea how to animate the event when 'setSizes()' is called on the splitter widget.
can anybody provide me the code for that in pyqt5?
Here is my code
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(QtWidgets.QMainWindow):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(400, 300)
self.centralWidget = QtWidgets.QWidget(MainWindow)
self.centralWidget.setObjectName("centralWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralWidget)
self.verticalLayout.setContentsMargins(11, 11, 11, 11)
self.verticalLayout.setSpacing(6)
self.verticalLayout.setObjectName("verticalLayout")
self.pushButton = QtWidgets.QPushButton(self.centralWidget)
self.pushButton.setObjectName("pushButton")
self.pushButton.clicked.connect(self.splitter_resize)
self.pushButton.setCheckable(True)
self.verticalLayout.addWidget(self.pushButton)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setSpacing(6)
self.horizontalLayout.setObjectName("horizontalLayout")
self.pushButton_2 = QtWidgets.QPushButton(self.centralWidget)
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralWidget)
self.pushButton_3.setObjectName("pushButton_3")
self.splitter = QtWidgets.QSplitter()
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.addWidget(self.pushButton_2)
self.splitter.addWidget(self.pushButton_3)
self.horizontalLayout.addWidget(self.splitter)
self.verticalLayout.addLayout(self.horizontalLayout)
MainWindow.setCentralWidget(self.centralWidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def splitter_resize(self):
if self.pushButton.isChecked():
self.splitter.setSizes([16777215, 0])
self.pushButton.setChecked = False
else:
self.splitter.setSizes([16777215, 16777215])
self.pushButton.setChecked = True
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
self.pushButton_2.setText(_translate("MainWindow", "PushButton"))
self.pushButton_3.setText(_translate("MainWindow", "PushButton"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
You can use QVariantAnimation:
from PyQt5 import QtCore, QtGui, QtWidgets
MIN_SIZE, MAX_SIZE = 0, 16777215
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
button = QtWidgets.QPushButton(
"Press me", checkable=True, toggled=self.onToggled
)
left_button = QtWidgets.QPushButton("Left")
right_button = QtWidgets.QPushButton("Right")
sp = right_button.sizePolicy()
sp.setHorizontalPolicy(QtWidgets.QSizePolicy.Ignored)
right_button.setSizePolicy(sp)
self.m_splitter = QtWidgets.QSplitter(orientation=QtCore.Qt.Horizontal)
self.m_splitter.addWidget(left_button)
self.m_splitter.addWidget(right_button)
widget = QtWidgets.QWidget()
self.setCentralWidget(widget)
lay = QtWidgets.QVBoxLayout(widget)
lay.addWidget(button)
lay.addWidget(self.m_splitter)
self.m_animation = QtCore.QVariantAnimation(
self,
startValue=MAX_SIZE,
endValue=MIN_SIZE,
valueChanged=self.onValueChanged,
duration=1000,
easingCurve=QtCore.QEasingCurve.InOutCubic,
)
#QtCore.pyqtSlot(bool)
def onToggled(self, checked):
self.m_animation.setDirection(
QtCore.QAbstractAnimation.Forward
if checked
else QtCore.QAbstractAnimation.Backward
)
self.m_animation.start()
#QtCore.pyqtSlot(QtCore.QVariant)
def onValueChanged(self, value):
s = [MAX_SIZE, value]
self.m_splitter.setSizes(s)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())