【发布时间】:2016-07-05 21:03:00
【问题描述】:
我正在使用 Qt Designer 来设计我的用户界面,并且我想构建自定义小部件,这些小部件可以是现有 qt 小部件的组合,例如 QLabel 和 QPushButton 附加屏幕截图
现在我希望它独立于它自己的业务逻辑、信号和插槽在一个单独的 python 文件中,但希望将它作为一个组件添加到我的主屏幕。
我在上面尝试通过创建单独的小部件类型的 ui 文件,但是当我从我的 MainWindow 提升它时,它不会显示出来,并且 pyuic 生成的代码会将它添加到布局中,但它没有呈现在主窗口。
有没有办法在 PyQt 和 QDesigner 中做到这一点?
编辑:
下面是实际代码:
timer.py:
from PyQt4 import QtGui, QtCore
from datetime import timedelta, datetime
from logbook import info
import timer_ui
class Timer(QtGui.QWidget, timer_ui.Ui_TimerWidget):
start_time = None
running = False
total_time = 0
time_spent = ''
activity = None
stopwatch = 0
elapsed_time = None
total_elapsed_time = timedelta()
def __init__(self, parent=None):
super(self.__class__, self).__init__(parent)
self.setupUi(parent) #for custom widget parent is main window here which is dashboard
self.lcdNumber.setDigitCount(12)
self.qt_timer = QtCore.QTimer(self)
self.qt_timer.timeout.connect(self.timer_event)
self.qt_timer.start(1000)
self.goButton.clicked.connect(self.go)
self.breakButton.clicked.connect(self.break_timer)
def go(self):
# date text format .strftime('%a, %d %b %Y %H:%M:%S')
self.start_time = datetime.now().replace(microsecond=0)
self.running = True
self.goButton.setEnabled(False)
self.breakButton.setEnabled(True)
def break_timer(self):
''' break finishes the activity '''
break_time = datetime.now().replace(microsecond=0)
self.activity.log_break(break_time.isoformat())
self.activity = None # activity completed
self.total_elapsed_time += self.elapsed_time
info(self.total_elapsed_time)
self.running = False
# self.lcdNumber.display(str(self.timer.get_elapsed()))
self.goButton.setEnabled(True)
self.breakButton.setEnabled(False)
def timer_event(self):
'''Updates the widget every second'''
if self.running == True:
current_time = datetime.now().replace(microsecond=0)
# if self.elapsed_time is None:
self.elapsed_time = current_time - self.start_time
# else:
#self.elapsed_time += current_time - self.timer.start_time.replace(microsecond=0)
if self.total_elapsed_time is not None:
self.lcdNumber.display(str(self.elapsed_time + self.total_elapsed_time))
else:
self.lcdNumber.display(str(self.elapsed_time))
mainwindow.py:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'dashboard.ui'
#
# Created: Sat Mar 19 11:40:35 2016
# by: PyQt4 UI code generator 4.10.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(772, 421)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.verticalLayout = QtGui.QVBoxLayout()
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.widget = Timer(self.centralwidget)
self.verticalLayout.addWidget(self.widget)
self.horizontalLayout = QtGui.QHBoxLayout()
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.userNameLabel = QtGui.QLabel(self.centralwidget)
self.userNameLabel.setObjectName(_fromUtf8("userNameLabel"))
self.horizontalLayout.addWidget(self.userNameLabel)
self.logoutButton = QtGui.QPushButton(self.centralwidget)
self.logoutButton.setEnabled(True)
self.logoutButton.setObjectName(_fromUtf8("logoutButton"))
self.horizontalLayout.addWidget(self.logoutButton)
self.verticalLayout.addLayout(self.horizontalLayout)
self.listView = QtGui.QListView(self.centralwidget)
self.listView.setObjectName(_fromUtf8("listView"))
self.verticalLayout.addWidget(self.listView)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.menuBar = QtGui.QMenuBar(MainWindow)
self.menuBar.setGeometry(QtCore.QRect(0, 0, 772, 23))
self.menuBar.setObjectName(_fromUtf8("menuBar"))
MainWindow.setMenuBar(self.menuBar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "Title", None))
self.userNameLabel.setText(_translate("MainWindow", "You are now logged in as", None))
self.logoutButton.setText(_translate("MainWindow", "Logout", None))
from timer import Timer
timer_ui.py:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'timer.ui'
#
# Created: Sat Mar 19 11:41:40 2016
# by: PyQt4 UI code generator 4.10.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_TimerWidget(object):
def setupUi(self, TimerWidget):
TimerWidget.setObjectName(_fromUtf8("TimerWidget"))
TimerWidget.resize(412, 52)
self.horizontalLayout = QtGui.QHBoxLayout(TimerWidget)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.label = QtGui.QLabel(TimerWidget)
self.label.setObjectName(_fromUtf8("label"))
self.horizontalLayout.addWidget(self.label)
self.lcdNumber = QtGui.QLCDNumber(TimerWidget)
self.lcdNumber.setAutoFillBackground(False)
self.lcdNumber.setNumDigits(12)
self.lcdNumber.setSegmentStyle(QtGui.QLCDNumber.Flat)
self.lcdNumber.setObjectName(_fromUtf8("lcdNumber"))
self.horizontalLayout.addWidget(self.lcdNumber)
self.goButton = QtGui.QPushButton(TimerWidget)
self.goButton.setObjectName(_fromUtf8("goButton"))
self.horizontalLayout.addWidget(self.goButton)
self.breakButton = QtGui.QPushButton(TimerWidget)
self.breakButton.setObjectName(_fromUtf8("breakButton"))
self.horizontalLayout.addWidget(self.breakButton)
self.retranslateUi(TimerWidget)
#QtCore.QMetaObject.connectSlotsByName(TimerWidget)
def retranslateUi(self, TimerWidget):
#TimerWidget.setWindowTitle(_translate("TimerWidget", "Form", None))
self.label.setText(_translate("TimerWidget", "Total hours spent", None))
self.goButton.setText(_translate("TimerWidget", "Go!", None))
self.breakButton.setText(_translate("TimerWidget", "Break", None))
【问题讨论】:
标签: python layout pyqt qt-designer