【问题标题】:How to customize rows in QTableWidget如何在 QTableWidget 中自定义行
【发布时间】:2019-10-13 05:05:14
【问题描述】:

我有一个 QTableWidget,但我需要自定义行,以便它们之间有间距并具有圆角。我知道如何使用样式表制作圆角,但我不确定如何将样式表应用于 QTableWidget 中的一行,我也不确定如何在行之间放置间距。

表格应该是这样的:

我当前的代码只是一个简单的 QTableWidget,其中包含一些模型数据

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QMainWindow, QApplication, QWidget, QAction, 
         QTableWidget,QTableWidgetItem,QVBoxLayout, QAbstractItemView)
from PyQt5.QtGui import QPainter, QColor, QFont, QBrush


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(50, 50, 700, 500))

        font = QtGui.QFont()
        font.setPointSize(15)


        self.tableWidget.setFocusPolicy(QtCore.Qt.NoFocus)
        self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.tableWidget.setSelectionMode(QAbstractItemView.SingleSelection)
        self.tableWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.tableWidget.verticalHeader().setVisible(False)
        self.tableWidget.horizontalHeader().setVisible(False)
        self.tableWidget.setShowGrid(False)

        self.tableWidget.setStyleSheet("background-color: black; selection-background-color: #353535; border-radius: 10px")
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setRowCount(0)

        data = [["Login", "Routine", "03/05/2019", "IP Address", "Yes"], ["Login", "Routine", "03/05/2019", "IP Address", "Yes"], ["Login", "Routine", "03/05/2019", "IP Address", "Yes"]]

        j=0
        for row in data:

            self.tableWidget.insertRow(j)
            j += 1
            i = 0
            for x in row:
                item = QTableWidgetItem(x)
                item.setForeground(QBrush(QColor(255, 255, 255)))
                item.setFont(font)

                self.tableWidget.setSortingEnabled(False)

                if(j == 1 and i <= 4):
                    self.tableWidget.insertColumn(i)

                self.tableWidget.setItem(j-1, i, QtWidgets.QTableWidgetItem(item))

                if (i == 4):
                    self.tableWidget.setColumnHidden(i, True);

                self.tableWidget.setSortingEnabled(True)

                i += 1

        self.tableWidget.horizontalHeader().resizeSection(0, 188)
        self.tableWidget.horizontalHeader().resizeSection(1, 155)
        self.tableWidget.horizontalHeader().resizeSection(2, 250)

        self.tableWidget.horizontalHeader().resizeSection(3, 66)
        self.tableWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

        self.tableWidget.horizontalHeader().setStretchLastSection(True)



        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


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_())

如何编辑我的代码以使行看起来像照片中的行?

【问题讨论】:

    标签: python python-3.x pyqt pyqt5


    【解决方案1】:

    试试看:

    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import (QMainWindow, QApplication, QWidget, QAction, 
             QTableWidget,QTableWidgetItem,QVBoxLayout, QAbstractItemView)
    from PyQt5.QtGui import QPainter, QColor, QFont, QBrush
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
            self.tableWidget.setGeometry(QtCore.QRect(50, 50, 700, 500))
    
            font = QtGui.QFont()
            font.setPointSize(15)
    
            self.tableWidget.setFocusPolicy(QtCore.Qt.NoFocus)
            self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
            self.tableWidget.setSelectionMode(QAbstractItemView.SingleSelection)
            self.tableWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
            self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
            self.tableWidget.verticalHeader().setVisible(False)
            self.tableWidget.horizontalHeader().setVisible(False)
            self.tableWidget.setShowGrid(False)
    
    #        self.tableWidget.setStyleSheet("background-color: black; selection-background-color: #353535; border-radius: 10px")
            self.tableWidget.setObjectName("tableWidget")
            self.tableWidget.setRowCount(0)
    
            data = [["Login", "Routine", "03/05/2019", "IP Address", "Yes"], ["Login", "Routine", "03/05/2019", "IP Address", "Yes"], ["Login", "Routine", "03/05/2019", "IP Address", "Yes"]]
    
            j=0
            for row in data:
                self.tableWidget.insertRow(j)
                j += 1
                i = 0
                for x in row:
                    item = QTableWidgetItem(x)
                    item.setForeground(QBrush(QColor(255, 255, 255)))
                    item.setFont(font)
                    self.tableWidget.setSortingEnabled(False)
    
                    if(j == 1 and i <= 4):
                        self.tableWidget.insertColumn(i)
                    self.tableWidget.setItem(j-1, i, QtWidgets.QTableWidgetItem(item))
    
                    if (i == 4):
                        self.tableWidget.setColumnHidden(i, True);
                    self.tableWidget.setSortingEnabled(True)
    
                    i += 1
    
            self.tableWidget.horizontalHeader().resizeSection(0, 188)
            self.tableWidget.horizontalHeader().resizeSection(1, 155)
            self.tableWidget.horizontalHeader().resizeSection(2, 250)
            self.tableWidget.horizontalHeader().resizeSection(3, 66)
            self.tableWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
            self.tableWidget.horizontalHeader().setStretchLastSection(True)
    
            MainWindow.setCentralWidget(self.centralwidget)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    
    
    stylesheet = """
        QTableWidget {
            background-color: black; 
            border-radius: 10px
        }
    
        QTableWidget::item {
            color: #ff7777;                    
            background-color: #2222fd;
            margin-top: 5px;          
            border-radius: 9px;
            padding-left: 5px;
        }
    
        QTableWidget::item:selected {
            background-color: yellow;
            color: blue;
        }
    """
    
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        app.setStyleSheet(stylesheet)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 这太棒了!非常感谢你们的帮助。我已经尝试稍微修改它,以便在选择一行时没有默认的蓝色突出显示,但我似乎无法得到它。 When a row is selected, it does get highlighted to whatever color I choose, but there's still this blue in the background that I'm not sure how to get rid of.有什么建议么?再次感谢您的帮助。
    • @SheriefEl-Ghazawi 发布您的stylesheet =""" . . . """,以便我了解您的内容。
    • stylesheet = """ QTableWidget { background-color: black; border-radius: 10px } QTableWidget::item { color: white; background-color: black; margin-top: 5px; border-半径:9px;padding-left:5px;} QTableWidget::item:selected { background-color: #353535;; color: white; } """
    • @SheriefEl-Ghazawi 对不起,它显示了我,如图所示。尝试更改值。 QTableWidget :: item {... border-radius: 9px; ...} 8px 然后 10px 看看会发生什么。
    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2019-02-12
    • 2013-05-11
    • 1970-01-01
    相关资源
    最近更新 更多