def sizeHint(self, option, index): """ Returns the size needed to display the item in a QSize object. """ if index.column() == 3: starRating = StarRating(index.data()) return starRating.sizeHint() else: return QStyledItemDelegate.sizeHint(self, option, index)
def paint(self, painter, option, index): """ Paint the items in the table. If the item referred to by <index> is a StarRating, we handle the painting ourselves. For the other items, we let the base class handle the painting as usual. In a polished application, we'd use a better check than the column number to find out if we needed to paint the stars, but it works for the purposes of this example. """ if index.column() == 3: starRating = StarRating(index.data()) # If the row is currently selected, we need to make sure we # paint the background accordingly. if option.state & QStyle.State_Selected: # The original C++ example used option.palette.foreground() to # get the brush for painting, but there are a couple of # problems with that: # - foreground() is obsolete now, use windowText() instead # - more importantly, windowText() just returns a brush # containing a flat color, where sometimes the style # would have a nice subtle gradient or something. # Here we just use the brush of the painter object that's # passed in to us, which keeps the row highlighting nice # and consistent. painter.fillRect(option.rect, painter.brush()) # Now that we've painted the background, call starRating.paint() # to paint the stars. starRating.paint(painter, option.rect, option.palette) else: QStyledItemDelegate.paint(self, painter, option, index)
def __init__(self, parent=None): """ Initialize the editor object, making sure we can watch mouse events. """ super(StarEditor, self).__init__(parent) self.setMouseTracking(True) self.setAutoFillBackground(True) self.starRating = StarRating()
def setEditorData(self, editor, index): """ Sets the data to be displayed and edited by our custom editor. """ if index.column() == 3: editor.starRating = StarRating(index.data()) else: QStyledItemDelegate.setEditorData(self, editor, index)
app = QApplication(sys.argv) # Create and populate the tableWidget tableWidget = QTableWidget(4, 4) tableWidget.setItemDelegate(StarDelegate()) tableWidget.setEditTriggers(QAbstractItemView.DoubleClicked | QAbstractItemView.SelectedClicked) tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows) tableWidget.setHorizontalHeaderLabels( ["Title", "Genre", "Artist", "Rating"]) data = [["Mass in B-Minor", "Baroque", "J.S. Bach", 5], ["Three More Foxes", "Jazz", "Maynard Ferguson", 4], ["Sex Bomb", "Pop", "Tom Jones", 3], ["Barbie Girl", "Pop", "Aqua", 5]] for r in range(len(data)): tableWidget.setItem(r, 0, QTableWidgetItem(data[r][0])) tableWidget.setItem(r, 1, QTableWidgetItem(data[r][1])) tableWidget.setItem(r, 2, QTableWidgetItem(data[r][2])) item = QTableWidgetItem() item.setData(0, StarRating(data[r][3]).starCount) tableWidget.setItem(r, 3, item) tableWidget.resizeColumnsToContents() tableWidget.resize(500, 300) tableWidget.show() sys.exit(app.exec_())
def __init__(self, parent=None): QFrame.__init__(self, parent) self.setFixedSize(200, 300) self.setObjectName("Card") self.setAutoFillBackground(True) self.appId = -1 self.appIcon = "./img/card/bird.png" self.appBack = "./img/card/card_back.png" self.appName = "PROS Smart CPQ for Manufacturing" self.appDev = "By PROS\nWeb apps" self.appRating = 0 self.appFeedback = 0 self.appState = 0 self.style_str = "border: 1px solid #ddd; background: qlineargradient(spread:pad, x1:0 y1:0, x2:1 y2:1, stop:0 rgba(255, 255, 255, 255), stop:1 rgba(225, 225, 225, 225));" self.appDesc = "Deliver Sales Automation and Profits Through Personalized Selling" self.setBackgroundImage(self.appBack) self.iconSize = 48, 48 self.iconMargins = 10, 10, 10, 10 self.iconFrameStyle = STYLES.STYLE_DEFAULT self.iconFrame = QLabel(self) self.iconFrame.setAutoFillBackground(True) self.iconFrame.setObjectName("IconFrame") self.iconFrame.setStyleSheet(self.iconFrameStyle) self.imgIcon = QLabel(self.iconFrame) self.imgIcon.setPixmap(QPixmap(self.appIcon)) self.imgIcon.setFixedSize(48, 48) self.imgIcon.setScaledContents(True) self.iconLayout = QHBoxLayout(self.iconFrame) self.iconLayout.setContentsMargins(10, 10, 10, 10) self.iconLayout.setAlignment(Qt.AlignLeft) self.iconLayout.addWidget(self.imgIcon, Qt.AlignLeft) self.iconFrame.setLayout(self.iconLayout) self.txtName = ElideLabel("", self) self.txtName.setText(self.appName) self.txtName.setFont(QFont("Roboto", 15)) self.txtName.setElideMode(1) self.txtName.setWordWrap(True) self.txtDev = ElideLabel("", self) self.txtDev.setWordWrap(True) self.txtDev.setText(self.appDev) self.txtDev.setFont(QFont("Roboto", 8)) self.txtDesc = ElideLabel("", self) self.txtDesc.setText(self.appDesc) self.txtDesc.setAlignment(Qt.AlignTop) self.txtDesc.setFont(QFont("Roboto", 10)) self.txtDesc.setElideMode(1) self.txtDesc.setWordWrap(True) self.starRating = StarRating(self) self.feedbackGiven = QLabel(self) self.feedbackGiven.setObjectName("Feedback") self.feedbackGiven.setStyleSheet("#Feedback{color: #ababab}") self.feedbackGiven.setFont(QFont("Roboto", 12)) self.feedbackGiven.setAlignment(Qt.AlignVCenter) self.feedbackGiven.setText("(" + str(self.appFeedback) + ")") self.btnInstall = Button('Install', self) self.btnInstall.clicked.connect(self.onInstallClicked) self.btnLaunch = Button('Launch', self) self.btnLaunch.setButtonType(Button.BUTTON_TYPE.LAUNCH) self.btnLaunch.clicked.connect(self.onLaunchClicked) self.btnLaunch.hide() self.btnUninstall = Button('Uninstall', self) self.btnUninstall.setButtonType(Button.BUTTON_TYPE.DELETE) self.btnUninstall.clicked.connect(self.onUninstallClicked) self.btnUninstall.hide() self.shadowEffect = QGraphicsDropShadowEffect(self) self.shadowEffect.setBlurRadius(9) self.shadowEffect.setColor(QColor(225, 225, 225)) self.shadowEffect.setOffset(5, 5) self.setGraphicsEffect(self.shadowEffect) self.frameLayout = QVBoxLayout(self) self.frameLayout.setContentsMargins(0, 0, 0, 0) self.mainLayout = QVBoxLayout() self.mainLayout.setSpacing(5) self.mainLayout.setContentsMargins(10, 0, 10, 15) self.ratingLayout = QHBoxLayout() self.ratingLayout.setSpacing(5) self.ratingLayout.addWidget(self.starRating, 1, Qt.AlignLeft) self.ratingLayout.addWidget(self.feedbackGiven, 1, Qt.AlignLeft) self.separator = QFrame(self) self.separator.setObjectName("line") self.separator.setFixedHeight(2) self.separator.setFixedWidth(self.width()) self.separator.setFrameShape(QFrame.HLine) self.separator.setFrameShadow(QFrame.Sunken) self.btnLayout = QHBoxLayout() self.btnLayout.setContentsMargins(5, 5, 5, 10) self.btnLayout.setSpacing(20) self.btnLayout.setAlignment(Qt.AlignHCenter) self.btnLayout.addWidget(self.btnInstall) self.btnLayout.addWidget(self.btnUninstall) self.btnLayout.addWidget(self.btnLaunch) self.mainLayout.addWidget(self.txtName, 1, Qt.AlignLeft) self.mainLayout.addWidget(self.txtDev, 1, Qt.AlignLeft) self.mainLayout.addWidget(self.txtDesc, 3, Qt.AlignLeft) self.mainLayout.addLayout(self.ratingLayout, Qt.AlignLeft) self.frameLayout.addWidget(self.iconFrame, 1) self.frameLayout.addLayout(self.mainLayout) self.frameLayout.addWidget(self.separator) self.frameLayout.addLayout(self.btnLayout) self.setLayout(self.frameLayout) self.setAppState(self.appState) self.show()
def __init__(self, parent=None): super().__init__(parent) self.mShowAll = False self.mRatingFrame = QFrame(self) self.mRatingFrame.setFixedWidth(200) self.mRating = StarRating(self.mRatingFrame) self.mRating.adjustWidthByHeight(21) self.mRatedDate = QLabel("Sat, Jun 17, 2017", self.mRatingFrame) self.mRatedDate.setFont(QFont("SegeoUI", 12, QFont.Light)) self.mRater = QLabel("Anonymous", self.mRatingFrame) self.mRater.setFont(QFont("SegeoUI", 12, QFont.Light)) self.mRatingLayout = QVBoxLayout(self.mRatingFrame) self.mRatingLayout.setContentsMargins(10, 5, 10, 5) self.mRatingLayout.setAlignment(Qt.AlignTop) self.mRatingLayout.setSpacing(15) self.mRatingLayout.addWidget(self.mRating, 0, Qt.AlignLeft | Qt.AlignTop) self.mRatingLayout.addWidget(self.mRatedDate, 0, Qt.AlignLeft | Qt.AlignTop) self.mRatingLayout.addWidget(self.mRater, 0, Qt.AlignLeft | Qt.AlignTop) self.mTxtFrame = QFrame(self) self.mTitle = ElideLabel(self.mTxtFrame, "Undefined") self.mTitle.setContentsMargins(0, 0, 0, 0) self.mTitle.setFont(QFont("SegeoUI", 14, QFont.Light)) self.mComment = AutoTextView(self.mTxtFrame) self.mComment.setFont(QFont("SegeoUI", 12, QFont.Light)) self.mComment.lessThanLimit.connect(self.onLessThanLimit) self.mComment.moreThanLimit.connect(self.onMoreThanLimit) self.mComment.setAutoFillBackground(True) self.mBtnMore = Link(self.mTxtFrame, "Read More") self.mBtnMore.setHoverColor("rgba(25, 55, 155, 255);") self.mBtnMore.setHoverStyle("") self.mBtnMore.setFont(QFont("SegeoUI", 12, QFont.Light)) self.mBtnMore.setContentsMargins(0, 0, 0, 0) self.mBtnMore.clicked.connect(self.onReadMore) self.mBtnReport = Link(self.mTxtFrame, "Report this review") self.mBtnReport.setDefaultColor("rgba(0, 0, 0, 255);") self.mBtnReport.clicked.connect(self.onReport) self.mCaptionLayout = QHBoxLayout() self.mCaptionLayout.setContentsMargins(0, 0, 0, 0) self.mCaptionLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop) self.mCaptionLayout.addWidget(self.mTitle) self.mTxtLayout = QVBoxLayout(self.mTxtFrame) self.mTxtLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop) self.mTxtLayout.setContentsMargins(5, 5, 5, 5) self.mTxtLayout.setSpacing(5) self.mTxtLayout.addLayout(self.mCaptionLayout, 0) self.mTxtLayout.addWidget(self.mComment) self.mTxtLayout.addWidget(self.mBtnMore, 0, Qt.AlignLeft | Qt.AlignTop) self.mTxtLayout.addWidget(self.mBtnReport, 0, Qt.AlignLeft | Qt.AlignTop) self.mLayout = QHBoxLayout(self) self.mLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop) self.mLayout.addWidget(self.mRatingFrame) self.mLayout.addWidget(self.mTxtFrame) self.setObjectName("ReviewCard")
def __init__(self, parent=None): super().__init__(parent) self.mIsPressed = False self.mStar = StarRating(self) self.mStar.setClickable(True) self.mStar.adjustWidthByHeight(25) self.separator = QFrame(self) self.separator.setObjectName("Separator") self.separator.setFixedHeight(2) self.separator.setFrameShape(QFrame.HLine) self.separator.setFrameShadow(QFrame.Sunken) self.mTitleEdit = QLineEdit(self) self.mTitleEdit.setObjectName("BriefEdit") self.mTitleEdit.setStyleSheet( "#BriefEdit{border: 1px solid lightgrey;}") self.mTitleEdit.setPlaceholderText("Title") self.mTitleEdit.setFont(QFont("SegeoUI", 12)) self.mTitleEdit.textChanged.connect(self.onTitleChanged) self.mTitleWarning = QLabel(self) self.mTitleWarning.setObjectName("BriefWarning") self.mTitleWarning.setStyleSheet( "#BriefWarning{border: none; color: red; background: transparent;}" ) self.mTitleWarning.setText("This field is required!") self.mTitleWarning.hide() self.mComment = QTextEdit(self) self.mComment.setPlaceholderText("Comment") self.mComment.setObjectName("DescEdit") self.mComment.setStyleSheet("#DescEdit{border: 1px solid lightgrey}") self.mComment.setFont(QFont("SegeoUI", 10, QFont.Light)) self.mTextLayout = QVBoxLayout() self.mTextLayout.setContentsMargins(0, 0, 0, 0) self.mTextLayout.setSpacing(5) self.mTextLayout.addWidget(self.mTitleWarning) self.mTextLayout.addWidget(self.mTitleEdit) self.mTextLayout.addWidget(self.mComment) self.mBtnSubmit = ReviewButton(self, "Submit") self.mBtnSubmit.setFixedWidth(150) self.mBtnSubmit.clicked.connect(self.accept) self.mBtnClose = CloseButton(self) self.mBtnClose.setFixedWidth(self.mBtnClose.height()) self.mBtnClose.clicked.connect(self.reject) self.mBtnClose.setGeometry(self.width() - self.mBtnClose.width() - 1, 1, self.mBtnClose.width(), self.mBtnClose.height()) self.mBtnLayout = QHBoxLayout() self.mBtnLayout.setContentsMargins(30, 10, 30, 20) self.mBtnLayout.addWidget(self.mBtnSubmit) self.mLayout = QVBoxLayout(self) self.mLayout.setContentsMargins(10, 20, 10, 10) self.mLayout.setSpacing(20) self.mLayout.addWidget(self.mStar, 0, Qt.AlignCenter) self.mLayout.addWidget(self.separator) self.mLayout.addLayout(self.mTextLayout) self.mLayout.addLayout(self.mBtnLayout) self.setWindowFlags(Qt.FramelessWindowHint) self.setFixedSize(400, 400) self.setObjectName("SubmitDialog") self.setStyleSheet( "#SubmitDialog{border: 1px solid lightgrey; background-color: white;}" )