我有一个带有自定义小部件的 QTableWidget。这些小部件很大,几乎占据了整个滚动区域的高度,因此只有一行可见。
我可以用鼠标滚轮或拖动滚动条滚动,但行总是跳跃。
有没有办法配置 QTableWidget 平滑滚动,而不跳跃?
| Name | Math | Physics | Average grade |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
“数学”和“物理”栏供用户输入数字,“平均”栏不能输入数值,它仅用于显示用户输入“数学”和“物理”成绩后的平均值。如何禁用编辑但仍在“平均值”列中显示计算值?
我想将内容写入多行,但我的代码不起作用
ui->tableWidget->setColumnCount(4);
ui->tableWidget->setRowCount(8);
ui->tableWidget->setSortingEnabled(false);
QTableWidgetItem *newItem = new QTableWidgetItem(tr("Hello World"));
for (int i=0; i< ui->tableWidget->rowCount(); i++)
ui->tableWidget->setItem(i, 0, newItem);
Run Code Online (Sandbox Code Playgroud)有一条消息是这样的
QTableWidget: cannot insert an item that is already owned by another QTableWidget
Run Code Online (Sandbox Code Playgroud)
我还是不明白,因为我是QT的新手。请帮助我,非常感谢!:)
更新代码:
for (int i = 0; …Run Code Online (Sandbox Code Playgroud) 如何更改QTableWidget标题的字体及其内容边距和间距?我想让“Column 0”、“Column 1”的字体变小,并且列名称和标题边缘之间没有间距。
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
columns = ['Column 0', 'Column 1', 'Column 2']
items = [['Row%s Col%s'%(row,col) for col in range(len(columns))] for row in range(100)]
view = QtGui.QTableWidget()
view.setColumnCount(len(columns))
view.setHorizontalHeaderLabels(columns)
view.setRowCount(len(items))
for row, item in enumerate(items):
for col, column_name in enumerate(item):
item = QtGui.QTableWidgetItem("%s"%column_name)
view.setItem(row, col, item)
view.setRowHeight(row, 16)
view.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud) 我希望在选择某个项目时有不同的选择颜色。但QTableWidget::item:selected{ background-color: }仅当仅选择一个项目时才有效,否则所有选定的项目将具有相同的选择颜色。那么有没有办法让每件物品都有单独的选择颜色呢?
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
self.MainWindow=MainWindow
self.MainWindow.resize(300, 100)
self.centralwidget = QtWidgets.QWidget(self.MainWindow)
self.MainWindow.setCentralWidget(self.centralwidget)
"""table """
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.insertRow(0)
self.tableWidget.setColumnCount(2)
self.tableWidget.setItem(0,0,QtWidgets.QTableWidgetItem("red"))
self.tableWidget.setItem(0,1,QtWidgets.QTableWidgetItem("blue"))
self.tableWidget.itemSelectionChanged.connect(self.ChangeSelectionColor)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def ChangeSelectionColor(self):
try:
for item in self.tableWidget.selectedItems():
col=item.column()
self.tableWidget.setStyleSheet("QTableWidget::item:selected{ background-color: %s }"%color_list[col])
except UnboundLocalError:
pass
if __name__ == "__main__":
import sys
color_list=['red','blue']
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
一种选择效果很好。
多重选择只是将颜色应用于所有选定的项目。我希望左边的那个一旦被选中就变成红色。
我想将各种小部件添加到表格小部件中的各种单元格,并且我想在这些小部件的值发生更改时触发命令。我可以根据需要将小部件放入表格中,但是我在连接信号时遇到问题,因此我知道哪个小部件生成了信号。
下面是一个简单的例子来解释这个问题,只使用复选框:
from PyQt5 import QtWidgets, QtGui, QtCore
class Main(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
# create table:
self.table = QtWidgets.QTableWidget()
[self.table.insertRow(i) for i in [0,1,2]]
[self.table.insertColumn(i) for i in [0,1]]
# set values for first column:
self.table.setItem(0, 0, QtWidgets.QTableWidgetItem('A') )
self.table.setItem(1, 0, QtWidgets.QTableWidgetItem('B') )
self.table.setItem(2, 0, QtWidgets.QTableWidgetItem('C') )
# add checkboxes to second column:
cb0 = QtWidgets.QCheckBox( parent=self.table )
cb1 = QtWidgets.QCheckBox( parent=self.table )
cb2 = QtWidgets.QCheckBox( parent=self.table )
self.table.setCellWidget(0, 1, cb0)
self.table.setCellWidget(1, 1, cb1)
self.table.setCellWidget(2, 1, cb2)
# connect …Run Code Online (Sandbox Code Playgroud) 如何更改列排序行为,而不是像这样按字母顺序排序:
1、11.1、2、22.2、3 等
它将按数字排序,如下所示:
1、2、3、11.1、22.2 等
我需要仅更改特定列上的排序行为,而不是整个表上的排序行为,因为我想保持名称的正常字母顺序。
我还有一个包含文件大小的列。它们以 MB 和 GB 表示,我想对其进行排序,以便 800 MB 排在前面,1.4 GB 排在后面。它还存在字母排序的问题。有没有一种方法可以做到这一点?
我在使用 tablewidget 时遇到问题。
我在表格小部件(5 行和 1 列)中获取用户的输入。用户不必填写所有行。例如,假设他只填写了其中的 3 个。
然后我尝试使用以下方法在 python 中读取这些行:
tableWidget.item(1,1).text()
Run Code Online (Sandbox Code Playgroud)
但是,如果我将某些行留空,则运行代码总会出现一些问题。
目前我正在使用以下两种可能性来检查那件事:
1) 基本逻辑
if len(tableWidget.item(4,1).text())!=0:
print('Cell is non-empty')
Run Code Online (Sandbox Code Playgroud)
2)来自Qt文档
if tableWidget.item(4,1).text().isEmpty():
print('Cell is empty')
Run Code Online (Sandbox Code Playgroud)
但它们都不起作用!非常感谢!
from PyQt5 import QtCore, QtWidgets
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(120, 70, 256, 192))
self.tableWidget.setRowCount(5)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(1)
item = QtWidgets.QTableWidgetItem()
item.setText("Selected File")
self.tableWidget.setHorizontalHeaderItem(0, item)
self.pushButton_ok = QtWidgets.QPushButton("OK",self.centralwidget)
self.pushButton_ok.setGeometry(QtCore.QRect(100, 290, 337, 23))
self.pushButton_ok.setObjectName("pushButton_ok")
MainWindow.setCentralWidget(self.centralwidget)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.pushButton_ok.clicked.connect(lambda:self.click_me())
def click_me(self): …Run Code Online (Sandbox Code Playgroud) 我想通过单词列表搜索 QTableWidget-Table,如果找到了它们,我希望它们突出显示。
我试图从这里修改代码,以便通过单词列表搜索表格,而不仅仅是一个单词。不幸的是,我的结果不断被覆盖。我总是只得到列表中最后一个单词的结果。
有谁知道如何修改代码,以便显示整个单词列表的结果?
这是代码:
from PyQt5 import QtCore, QtGui, QtWidgets
import random
import html
words_1 = ["Hello dseerfd", "world sdfsdf sdfgsdf sdfsdf", "Stack dasdf", "Overflow", "Hello world", """<font color="red">Hello world</font>"""]
class HTMLDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self, parent=None):
super(HTMLDelegate, self).__init__(parent)
self.doc = QtGui.QTextDocument(self)
def paint(self, painter, option, index):
substring = index.data(QtCore.Qt.UserRole)
painter.save()
options = QtWidgets.QStyleOptionViewItem(option)
self.initStyleOption(options, index)
res = ""
color = QtGui.QColor("red")
if substring:
substrings = options.text.split(substring)
res = """<font color="{}">{}</font>""".format(color.name(QtGui.QColor.HexRgb), substring).join(list(map(html.escape, substrings)))
else:
res = html.escape(options.text)
self.doc.setHtml(res)
options.text …Run Code Online (Sandbox Code Playgroud) 基本上,我在 QTableWidget 的每一行都有一个用于单击事件的删除按钮。
如何找到被点击的特定按钮的行索引?
class WidgetGallery(QDialog):
def __init__(self, parent=None):
super(WidgetGallery, self).__init__(parent)
self.table = QTableWidget(10, 3)
col_1 = QTableWidgetItem("first_col")
col_2 = QTableWidgetItem("second_col")
deleteButton = QPushButton("delete_this_row")
deleteButton.clicked.connect(self.deleteClicked)
self.table.setItem(0, 0, col_1)
self.table.setItem(0, 1, col_2)
self.table.setCellWidget(0, 2, deleteButton)
self.mainLayout = QGridLayout()
self.mainLayout.addWidget(self.table)
def deleteClicked(self):
sender = self.sender()
row = sender.parent().........?
Run Code Online (Sandbox Code Playgroud) 我一直在谷歌上搜索这个问题并阅读 qt 文档,但我能找到的所有答案都是为 Qt for C++ 编写的
我试图了解如何从 QTableWidget 中删除所有水平网格线,就像这里的一样

使表格看起来像一个包含行和列的列表
我尝试使用样式表来改变小部件的外观,但它们似乎对表格的外观没有影响
qtablewidget ×10
pyqt ×8
python ×8
pyqt5 ×6
qt ×3
python-3.x ×2
qtableview ×1
scroll ×1
sorting ×1