我知道这个问题已经被问过:
如何设置QTableView的行高?
但答案是:
QHeaderView *verticalHeader = myTableView->verticalHeader();
verticalHeader->setSectionResizeMode(QHeaderView::Fixed);
verticalHeader->setDefaultSectionSize(24);
Run Code Online (Sandbox Code Playgroud)
仍然会产生过高的行。如果我设置任何小于 24 的数字,就像
verticalHeader->setDefaultSectionSize(10)我得到相同的结果一样,行仍然太高。
有什么办法可以让 QTableView 中的行高度更小,就像默认情况下 QListView 或 QTreeView 中的情况一样?
我不明白为什么 QTableView 中的行默认情况下和设计上比 QListView 和 QTreeView 中的行高得多(几乎是两倍)(即使使用verticalHeader->setDefaultSectionSize(24))。太丑了。
我正在 PyQt5 中编写一个自定义 TableModel,继承自QtCore.QAbstractTableModel. 我希望我的表格有一列仅包含复选框,没有文本,一列每行都有一个按钮。
我尝试在该角色的方法中返回一个QPushButton对象,但显然这是不可能的。dataQt.Display
所以我的问题是:我可以在模型本身中实现它为某些单元格返回某些小部件吗?在我看来,这是模型的工作,但我如何实现这一点呢?
我的第二个问题是我必须如何分配插槽,以便我知道操作是从哪个按钮(从哪一行)发生的?
QTableView我在 a 中有两个s QMainWindow,我想在其中一个上创建一个上下文菜单,然后在另一个上创建另一个上下文菜单。
到目前为止,创建上下文菜单并定义操作是有效的。但上下文菜单会在整个应用程序内的任何地方弹出。我不知道如何将其限制为只有一张特定的表。contextMenuEvent()我认为这与的成员有关,QMainWindow但我不知道如何更改这部分。尝试创建一个继承的自定义类QTableView不起作用,因为我不确定从哪里开始。
这是我尝试过的:
和populate_table_1()方法populate_table_2()仅用于将一些数据填充到表中。该get_selected_item_TV1()方法从一行中获取必要的数据table_1。该delete_file()方法是我在从该方法调用删除操作时想要执行的操作的示例contextMenuEvent()。到目前为止,此代码有效,但我希望仅当我右键单击一行时才弹出上下文菜单table_1,并且在右键单击其他地方时它根本不会出现。
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
data_1 = ["file_name", "file_infos"]
data_2 = ["other_stuff_1", "other_stuff_2"]
class Ui_MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("MyApp")
self.resize(450, 280)
centralwidget = QWidget(self)
#]===================================================================[#
# table_1
table_1 = QTableView(
centralwidget,
selectionBehavior=QAbstractItemView.SelectRows,
editTriggers=QAbstractItemView.NoEditTriggers
)
# table_1 models
self.modelTV1 = QStandardItemModel(0, 2, …Run Code Online (Sandbox Code Playgroud) 你好,我已经创建了主窗口,如上所示。我想尽可能地扩展第一个小部件(绘图),以便其他两个小部件适合内容(或者实际上,我想删除表格下方的空白空间)。我不知道该怎么做。
目前,两个表的垂直标题大小策略都设置为 FitToContent。
另外,它需要是动态的,因此如果我向表中添加新行,新行应该是可见的(表会更大)。
我希望我足够清楚,也希望不需要可运行的代码。
我有QTableView列之一中具有QComboBox。组合框显示来自矢量的数据,当我单击按钮时,这些数据会更新。当我启动应用程序时,组合框显示矢量中的所有项目。现在,我按下按钮(它将向向量中添加更多项目),但是组合框不会在向量中反映新数据。它仍然显示旧数据。一旦向量更新,我也将发出dataChanged(),但看不到任何变化。data()函数确实在模型中得到调用,该模型确实返回了向量的所有元素,但是setEditorData在委托中没有得到调用。
我错过了什么吗?
谢谢,
开发人员
如何让QTableView单元格在编辑时保持其原始值?当我开始编辑单元格时,它会自动清除.我搜索了整个地方,我找不到任何会引导某个地方的指针.我的模型视图的实现:
class BlockViewModel(QAbstractTableModel):
def __init__(self, structure, data):
QAbstractTableModel.__init__(self)
self._data = data
self._struct = structure
for i, s in enumerate(structure):
cmnt = s['comment']
name = cmnt if cmnt else s['name']
self.setHeaderData(i, Qt.Horizontal, name)
def rowCount(self, parent=QModelIndex()):
return len(self._data)
def columnCount(self, parent = QModelIndex()):
return len(self._struct)
def data(self, index, role):
if role == Qt.DisplayRole:
try:
row = index.row()
col = index.column()
name = self._struct[col]['name']
return self._data[row][name]
except:
pass
elif role == Qt.CheckStateRole:
return None
return None
def flags(self, index):
flags = super(self.__class__,self).flags(index) …Run Code Online (Sandbox Code Playgroud) 如何创建QTableView多线单元?
我正在使用下面的代码填充表格.但是Whem GetDescription()返回一个长字符串,内容终止于...
有一些方法可以自动断线吗?
QStandardItemModel * model = new QStandardItemModel(logos.size(), 2, this);
model->setHorizontalHeaderItem(0, new QStandardItem(QString("")));
model->setHorizontalHeaderItem(1, new QStandardItem(QString("Nome")));
model->setHorizontalHeaderItem(2, new QStandardItem(QString("Descrição")));
int row = 0;
foreach(Item * item, items)
{
QStandardItem* check = new QStandardItem(true);
check->setCheckable(true);
model->setItem(row, 0, check);
QStandardItem *nameItem = new QStandardItem(QString(item->GetName()));
nameItem->setEditable(false);
model->setItem(row, 1, nameItem);
QStandardItem *descriptionItem = new QStandardItem(item->GetDescription());
descriptionItem->setEditable(false);
descriptionItem->setToolTip(logo->GetDescription());
model->setItem(row, 2, descriptionItem);
row++;
}
ui->tableView->setModel(model);
ui->tableView->resizeColumnToContents(0);
ui->tableView->resizeColumnToContents(1);
ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
Run Code Online (Sandbox Code Playgroud) 我正在研究一个测试用例编辑器.该编辑器包含USART发送和接收数据包格式.编辑器是一个表格视图.
发送和接收数据包长度为8个字节,例如:
0x01 0x02 0x03 ... 0x08
Run Code Online (Sandbox Code Playgroud)
这是我的第五和第六栏.现在,我希望此列中的单元格只读,但是当我双击这些列中的任何单元格时,会显示一个弹出窗口小部件.该小部件将在文本编辑中包含八个框,其中用户可以输入数据包格式(即八个字节长)数据.我可以轻松地将这些数据从弹出窗口小部件复制回后端的只读单元格.
这将取消用户的所有策略,例如每个字节之间是否应该有空格.因此,这将消除潜在的人为错误.
1:是否有用于双击表视图单元格的事件处理程序?
2:我可以为同一列的每个单元格设置一个通用的双击处理程序吗?
3:如何在表格视图中只读取特定列的单元格,同时保留最终可以更改其值(即返回)的事实?

我在Qt 4.7工作,我有一个完全填充的QTableView,其中包含可变行数和设置列数.我有一个QStringList,我需要填充特定列的值,让我们说每行的第二个.到目前为止我有这个:
QStringList list;
for (int i = 0; i < ui->myTableView->height()/*see note below*/; i++)
{
list.append(/*code I still need...*/);
}
Run Code Online (Sandbox Code Playgroud)
//note: I also tried it using this->ui->myTableView->model->rowCount(), not sure which is best for this...
QStringList list;
for (int i = 0; i < ui->myTableView->height()/*see note below*/; i++)
{
list.append(/*code I still need...*/);
}
Run Code Online (Sandbox Code Playgroud)
//note: I also tried it using this->ui->myTableView->model->rowCount(), not sure which is best for this...
我的问题是我找不到任何能让我在给定行号和列号的情况下获取QTableView值的函数.我不知道我是不是只是忽略它,但我一直在浏览文档,似乎无法找到任何东西.如果有人有任何想法,我真的很感激帮助.谢谢!
qtableview ×10
qt ×7
python ×5
c++ ×4
pyqt5 ×3
pyqt ×2
pyside ×2
contextmenu ×1
datamodel ×1
qcombobox ×1
qt4 ×1
qt5 ×1
qtablewidget ×1
qtgui ×1
selection ×1