我目前有一个tableview附加到一个派生自QSortFilterProxyModel的类.现在我想知道是否有任何方法可以存储列的顺序,因为用户倾向于来回移动列.当用户更改列的顺序时,也会发出任何信号.我搜索这个但是找不到任何可能在移动列时向我发送信息以及如何保存tablew列命令的信号.任何建议都会受到赞赏
我有一个QWidget,里面有一个QTableView.我需要在表的第一列有一个查找功能,所以当我点击Ctrl + F时,会弹出一个查找对话框.
class Widget(QWidget):
def __init__(self,md,parent=None):
QWidget.__init__(self,parent)
layout=QVBoxLayout(self)
# initially construct the visible table
tv = QTableView()
# uncomment this if the last column shall cover the rest
tv.horizontalHeader().setStretchLastSection(True)
tv.show()
# set black grid lines
self.setStyleSheet("gridline-color: rgb(39, 42, 49)")
# construct the Qt model belonging to the visible table
model = NvmQtModel(md)
tv.setModel(model)
tv.resizeRowsToContents()
tv.resizeColumnsToContents()
# set the shortcut ctrl+F for find in menu
shortcut = QShortcut(QKeySequence('Ctrl+f'), self)
shortcut.activated.connect(self.handleFind)
# delegate for decimal
delegate = NvmDelegate()
tv.setItemDelegate(delegate)
self.setGeometry(200,200,600,600) # …Run Code Online (Sandbox Code Playgroud) 当一个QTableView的QModelIndex被点击我要选择同一行的索引的一整行.
要做到这一点我连接QTableView的clicked信号到自定义viewClicked()该自动接收点击QModelIndex方法:
self.tableview=QTableView()
self.tableview.clicked.connect(self.viewClicked)
Run Code Online (Sandbox Code Playgroud)
在viewClicked(self, clickedIndex)我查询clickedIndex的行号,其模型和列总数中:
row=clickedIndex.row()
model=clickedIndex.model()
columnsTotal=model.columnCount(None)
Run Code Online (Sandbox Code Playgroud)
最后选择一行中的每个索引:
for i in range(columnsTotal): self.tableview.selectRow(row)
Run Code Online (Sandbox Code Playgroud)
问题是Qt处理此类操作的速度明显缓慢.我想知道在单击其中一个tableview项时是否有更快的方法来选择整行索引:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
class Model(QAbstractTableModel):
def __init__(self, parent=None, *args):
QAbstractTableModel.__init__(self, parent, *args)
self.items = ['Row0_Column0','Row0_Column1','Row0_Column2']
def flags(self, index):
return Qt.ItemIsEnabled | Qt.ItemIsSelectable
def rowCount(self, parent):
return 1
def columnCount(self, parent):
return len(self.items)
def data(self, index, role):
if not index.isValid(): return QVariant()
elif role …Run Code Online (Sandbox Code Playgroud) 此代码创建单个QTableView. 单击该列将显示指示列排序方向的箭头。单击 tableView 的项目本身会打印出单击的索引。单击 tableView 项时,我想知道三列(标题)中的哪一列是当前的(显示箭头的列)以及排序箭头指向的方向:向上或向下。如何实现这一目标?
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Model(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]
def rowCount(self, parent=QtCore.QModelIndex()):
return 3
def columnCount(self, parent=QtCore.QModelIndex()):
return 3
def data(self, index, role):
if not index.isValid(): return
if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]:
return self.items[index.row()][index.column()]
def onClick(index):
print 'clicked index: %s'%index
def sortIndicatorChanged(column=None, sortOrder=None):
print 'sortIndicatorChanged: column: %s, sortOrder: %s'%(column, sortOrder)
tableModel=Model()
tableView=QtGui.QTableView()
tableView.setModel(tableModel)
tableView.setSortingEnabled(True)
tableView.clicked.connect(onClick)
tableView.horizontalHeader().sortIndicatorChanged.connect(sortIndicatorChanged)
tableView.show() …Run Code Online (Sandbox Code Playgroud) 我有一个使用 QTableView 和 QListView 的 Qt 应用程序。在两个witdgets 中我都显示了一些图标。
问题是,当用户选择其中一个条目时,Qt alpha 会混合图标上的选择,从而使图标显示的对比度较低且颜色略有不同。
我希望 Qt 首先绘制选区,然后在顶部绘制图标,这样无论是否选择它们,它们看起来都一样。我怎样才能做到这一点?
更新:
这就是我的问题:
使用白色矩形图标更容易识别:
当您使用图形编辑器检查颜色值时,您会看到颜色值发生变化。我希望 Qt 在没有此覆盖的情况下按原样绘制图标。
这里的 QListView 采用颜色渐变背景样式。但我对无样式的 QTableView 也有同样的问题。
顺便说一句,所有图标都是 SVG。
我想修改给定 QTableView 中的任何单元格(标题除外)。以下是我的原始代码,不允许进行任何更改:
import sys
import csv
from datetime import datetime, timedelta
import calendar
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sqlite3
from pandas import DataFrame
class TBWindow(QMainWindow):
def __init__(self, parent=None):
super(TBWindow, self).__init__(parent)
sql = "select * from stock"
args = []
conn = sqlite3.connect('DataBase.db')
c = conn.cursor()
c.execute(sql,args)
data = c.fetchall()
names = list(map(lambda x: x[0], c.description))
c.close()
conn.close()
data = DataFrame(data, columns = names)
MenuBar = self.menuBar()
saveFile = QAction("&Save File", self) …Run Code Online (Sandbox Code Playgroud) 我尝试了 CSS 代码:
QTableView QHeaderView::section {
text-align: center;
}
Run Code Online (Sandbox Code Playgroud)
它没有帮助我。
PS 我在使用 Qt 的 WinCC OA 中编写 SCADA 系统,在那里您可以仅使用 CSS 更改组件的外观
我创建了一个基于 QAbstractTableModel 的模型,允许用户编辑该模型中的数据。该模型显示在 QMainWindow 中的 QTableView 中。到目前为止,在我的模型中,我能够使单元格可编辑,并在编辑完成后保存用户输入的任何内容。
问题是当用户开始编辑时,它会“清除”该单元格的先前内容。因此,例如,如果我只想更改单元格中字符串的拼写,则必须重新键入整个值。我希望在编辑时编辑器将从模型中已有的数据开始,而不是空的。
我怎样才能做到这一点?
问题示例:
在我开始编辑单元格之前:
我一开始编辑,单元格就是空的。我希望它以模型中已有的先前值作为星标:
这是我的模型的最小示例。我的实际模型要大得多,并且使用结构而不是 QVariants 的二维数组来存储数据。
标题:
const int COLS= 2;
const int ROWS= 6;
class EditableTableModel : public QAbstractTableModel
{
Q_OBJECT
private:
QVariant tableData[ROWS][COLS];
public:
EditableTableModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
QVariant headerData(int section, …Run Code Online (Sandbox Code Playgroud) 我(只是)希望能够使用QTableView拖放机制来移动现有行。我找到了很多资源(例如,这里,这里或这里),它们描述了拖放,插入等的某些方面,但我仍在努力使其适合我的情况。
这是我正在寻找的解决方案应该具备的功能:
本教程展示了一个非常接近我需要的解决方案,但它使用了一个QStandardItemModel而不是QAbstractTableModel对我来说看起来半优化的解决方案,因为我必须基于(我是对的吗?)QStandardItem需要的“镜像”数据结构进行操作。QStandardItemModel
下面附加了代表我当前进度的代码。
目前我看到两种可能的方法:
方法 1:实现QAbstractTableModel并实现所有需要的事件/槽以修改底层数据结构: * 优点:最通用的方法 * 优点:没有冗余数据 * 缺点:我不知道如何获知已完成的拖放操作以及什么索引移到了哪里
在我附加的代码中,我跟踪了我所知道的所有相关方法并打印出所有参数。这是将第 2 行拖到第 3 行时得到的结果
dropMimeData(data: ['application/x-qabstractitemmodeldatalist'], action: 2, row: -1, col: -1, parent: '(row: 2, column: 0, valid: True)')
insertRows(row=-1, count=1, parent=(row: 2, column: 0, valid: True))
setData(index=(row: 0, column: 0, valid: True), value='^line1', role=0)
setData(index=(row: 0, column: …Run Code Online (Sandbox Code Playgroud) qtableview ×10
qt ×7
python ×4
c++ ×3
pyqt ×3
python-3.x ×2
qt5 ×2
model ×1
pyqt5 ×1
qheaderview ×1
qlistview ×1
qscrollarea ×1
qtgui ×1
search ×1