在鼠标点击中更改选择在Linux上的tableview PyQt中的背景颜色

时间:2016-01-21 19:47:45

标签: python pyqt tableview pyqt5

我想在双击时列表中的项目出现问题时通知用户。

我使用了setStyleSheet,但却发现它不能用于统一和肉桂,而它适用于KDE和i3。

我不是那些精明的qbrushes或其他我正在谷歌搜索的东西。

那么解决这个问题的最佳方法是什么,以便它可以在任何地方使用?感谢。

这是我行动中解决方案的全部内容。

enter image description here

下面是它的代码,它的pyqt5,python3

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys

class My_Model_table(QAbstractTableModel):
    def __init__(self, table_data=[], parent=None):
        super().__init__()
        self.table_data = table_data

    def rowCount(self, parent):
        return len(self.table_data)

    def columnCount(self, parent):
        return 1

    def data(self, index, role):
        if role == Qt.DisplayRole:
            value = self.table_data[index.row()]
            return value
        if role == Qt.TextAlignmentRole:
            return Qt.AlignCenter

class My_table(QTableView):
    def __init__(self, parent=None):
        super().__init__()
        self.activated.connect(self.double_click_enter)

    def double_click_enter(self, QModelIndex):
        row = QModelIndex.row()
        self.setStyleSheet('selection-background-color:red;')
        self.alarm = QTimer()
        self.alarm.timeout.connect(self.row_color_back)
        self.alarm.setSingleShot(True)
        self.alarm.start(200)
        return

    def row_color_back(self):
        self.setStyleSheet('')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    data = ['1', '2', '3', '4', '5']
    main_table = My_table()
    main_table.setModel(My_Model_table(data))
    main_table.show()
    sys.exit(app.exec_())

2 个答案:

答案 0 :(得分:1)

尝试覆盖mousePressEventmouseReleaseEvent以下是代码的修改。我相信这应该适用于所有桌面环境

#!/usr/bin/python3
# -*- encoding: utf-8 -*-

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys

class TableData( QAbstractTableModel ):
    def __init__( self, data = [], parent = None ):
        super( QAbstractTableModel, TableData ).__init__( self, parent )
        self.data = data

    def rowCount( self, parent ):
        return len( self.data )

    def columnCount( self, parent ):
        return 1

    def data( self, index, role ):
        if role == Qt.DisplayRole:
            return self.data[ index.row() ]
        elif role == Qt.TextAlignmentRole:
            return Qt.AlignCenter

class Table( QTableView ):

    def __init__( self, parent = None ):
        super( QTableView, Table ).__init__( self )

    def mousePressEvent( self, mpEvent ) :
        self.setStyleSheet( "QTableView{ selection-background-color: red; }" )
        QTableView.mousePressEvent( self, mpEvent )

    def mouseReleaseEvent( self, mrEvent ) :
        self.setStyleSheet( "QTableView{ selection-background-color: none; }" )
        QTableView.mouseReleaseEvent( self, mrEvent )

if __name__ == '__main__':

    app = QApplication( sys.argv )

    Gui = Table()
    Gui.setModel( TableData( ['1', '2', '3', '4', '5'], Gui ) )
    Gui.show()

    sys.exit( app.exec_() )

PS:我刚刚在KDE / Plasma 5中试过这个。我没有GNOME / Unity接口来检查代码。

答案 1 :(得分:0)

好的,当我查看qdarkstylesheet时弄清楚我的错误。 而不只是selection-background-color我应该使用QTableView::item:selected:active

gif来自ubuntu

enter image description here

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys


class My_Model_table(QAbstractTableModel):
    def __init__(self, table_data=[], parent=None):
        super().__init__()
        self.table_data = table_data

    def rowCount(self, parent):
        return len(self.table_data)

    def columnCount(self, parent):
        return 1

    def data(self, index, role):
        if role == Qt.DisplayRole:
            value = self.table_data[index.row()]
            return value
        if role == Qt.TextAlignmentRole:
            return Qt.AlignCenter


class My_table(QTableView):
    def __init__(self, parent=None):
        super().__init__()
        self.activated.connect(self.double_click_enter)

    def double_click_enter(self, QModelIndex):
        row = QModelIndex.row()

        self.setStyleSheet(
           '''
           QTableView::item:selected:active {
                background: #00ff00;
            }
           '''
        )

        self.alarm = QTimer()
        self.alarm.timeout.connect(self.row_color_back)
        self.alarm.setSingleShot(True)
        self.alarm.start(200)
        return

    def row_color_back(self):
        self.setStyleSheet('')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    data = ['1', '2', '3', '4', '5']
    main_table = My_table()
    main_table.setModel(My_Model_table(data))

    main_table.show()
    sys.exit(app.exec_())