我正在尝试从 QTableView 编写一些继承类(我们称之为 A),并希望覆盖插槽
void 编辑(常量 QModelIndex 和索引)
来自 QAbstractItemView。我知道这个函数可以触发编辑模式,但我的问题是:我希望每当用户在 A 类中触发编辑模式时,程序都可以进入被覆盖的槽A::edit。
不过好像只有直接调用A::edit,程序才能进入。
由于 QTableView 来自 QAbstractItemView,如果通过其他方式(例如鼠标双击)触发编辑模式,程序将运行默认的QAbstractItemView::edit而不是A::edit。
我尝试连接“已激活”信号,但显然这不是触发编辑模式的正确信号。每次编辑器被触发时是否都要做一些事情?
另外,我想在编辑模式结束时通过按 Enter 或 ESC 或鼠标单击其他位置来执行一些操作。同样的情况也发生在插槽上
void editorDestroyed ( QObject * 编辑器 )
谁能帮我解决这个问题?我将非常感激,谢谢!
我需要在 python 中实现一个函数,该函数在按下“ctrl+v”时处理“粘贴”。我有一个QTableView,我需要复制表格的一个字段并将其粘贴到表格的另一个字段中。我尝试了以下代码,但问题是我不知道如何读取 tableView 中复制的项目(从剪贴板)。(因为它已经复制了该字段,我可以将其粘贴到其他任何地方,例如记事本)。这是我尝试过的代码的一部分:
class Widget(QWidget):
def __init__(self,md,parent=None):
QWidget.__init__(self,parent)
# initially construct the visible table
self.tv=QTableView()
self.tv.show()
# set the shortcut ctrl+v for paste
QShortcut(QKeySequence('Ctrl+v'),self).activated.connect(self._handlePaste)
self.layout = QVBoxLayout(self)
self.layout.addWidget(self.tv)
# paste the value
def _handlePaste(self):
if self.tv.copiedItem.isEmpty():
return
stream = QDataStream(self.tv.copiedItem, QIODevice.ReadOnly)
self.tv.readItemFromStream(stream, self.pasteOffset)
Run Code Online (Sandbox Code Playgroud) 我有一个 QTableView 组件,在行中显示多种类型的数据。我需要的是用不同的颜色显示每种类型的行。我的样式表如下所示:
RecordSheet::item {
border: 0px;
color: black;
padding: 1px 0px 0px 3px;
}
RecordSheet::item:selected, RecordSheet::item:selected:!active {
background-color: #e8b417;
color: black;
}
Run Code Online (Sandbox Code Playgroud)
我有两个想法如何实现这一目标:
使用data()模型中的方法并响应Qt::BackgroundColorRole。不幸的是,当我这样做时,背景颜色将被忽略,直到我border: 0px;从样式表中删除背景颜色,并且当我删除边框时,styleshhet 的填充将被忽略。奇怪的...
为每种类型的行设置 CSS/QSS 类,并在样式表中设置它们的颜色。然后使用模型为每种类型的行分配适当的类。所以样式表看起来像这样:
RecordSheet::item {
border: 0px;
color: black;
padding: 1px 0px 0px 3px;
}
RecordSheet::item[class=green_row] {
background-color: green;
}
RecordSheet::item[class=red_row] {
background-color: red;
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢这种方法,因为它将内容与外观分开,但我不知道该怎么做。也许使用 ItemDelegate?
请问,有人知道一个好的简单的解决方案吗?
亲切的问候和非常感谢。
扬
设置Qt.ItemIsEnabled标志使QTableView项目可编辑。要进入项目的编辑模式,用户只需双击它即可。编辑项目的另一种方法是选择它并按下键盘键。如何禁用进入项目编辑模式的第二种方式?
这是显示选中项目的 QTableView 的图像:

只要用户按下键盘键,所选项目就已处于编辑模式:

这种默认的 QTableView 行为使得无法定义功能快捷方式,因为 QListView 的项目没有触发链接到快捷方式的功能,而是进入编辑模式......如何让 QTableView 仅在双击时进入编辑模式?
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 = ['Item_A_001','Item_A_002','Item_B_001','Item_B_002']
def rowCount(self, parent=QModelIndex()):
return len(self.items)
def columnCount(self, parent=QModelIndex()):
return 1
def data(self, index, role):
if not index.isValid(): return QVariant()
elif role != Qt.DisplayRole:
return QVariant()
row=index.row()
if row<len(self.items):
return QVariant(self.items[row])
else:
return QVariant()
def flags(self, index):
return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable …Run Code Online (Sandbox Code Playgroud) 我试图在 python 中找到一个示例,我可以在其中循环 QTableView 的模型元素并打印整行。我已经找到了如何循环选定的行,但当未选择行时什么也没有。
有人能帮我吗?无需告诉我如何创建模型以及如何将其应用到 QTableModel。我只感兴趣如何迭代行。
| 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) 我想如果可能的话,它会涉及重新实现实际将颜色绘制到单元格中的函数,或者创建某种委托。
有人有这方面的经验吗?甚至有可能吗?
我使用 aQTableView来显示只读数据。该模型基于QList包含另一个QList. 像这样的东西:
typedef struct
{
int range;
QString description;
} Field;
typedef struct
{
QString name;
QList<Field> fields;
} Item;
QList<Item> items;
Run Code Online (Sandbox Code Playgroud)
在我的QAbstractTableModel实现中,我有一个选择当前的插槽item:
void setCurrentItem(int idx)
{
// checks for errors (omissis)
currentItemIdx = idx;
// ask to redraw the table
emit dataChanged(this->index(0, 0), this->index(rowCount(), columnCount()));
}
Run Code Online (Sandbox Code Playgroud)
模型的所有逻辑都依赖于该项目,例如:
int MyModel::rowCount(const QModelIndex&) const {
return items.at(m_currentItemIdx).fields.count();
}
QVariant MyModel::data(const QModelIndex &index, int role) const {
if (!index.isValid()) return QVariant();
if …Run Code Online (Sandbox Code Playgroud) 我想Key Down捕获QTableView. 我还想确定,如果它是DEL按钮上的按键,我的QTableView创建方式如下(来自QtCreator):
self.tblview_data_sources = QtWidgets.QTableView(self.groupBox_2)
self.tblview_data_sources.setGeometry(QtCore.QRect(10, 20, 721, 121))
self.tblview_data_sources.setObjectName("tblview_data_sources")
Run Code Online (Sandbox Code Playgroud)
如果它实际上是 DEL 键按下,我想重新移动当前选择的行。
QTableView有这个方法keyPressEvent需要QKeyEvent- 我如何获得这个事件?
qtableview ×10
qt ×6
python ×5
pyqt ×3
c++ ×2
delegates ×1
inheritance ×1
model ×1
paste ×1
pyqt4 ×1
pyqt5 ×1
pyside2 ×1
python-3.x ×1
qkeyevent ×1
qt4 ×1
qt5.2 ×1
qtablewidget ×1