QTableView.setColumnHidden()可选

QTableView.setColumnHidden()可选,qt,pyqt,pyqt4,Qt,Pyqt,Pyqt4,假设我有一个包含30列的表,并且希望使用QSqlTableModel/QTableView,只显示5列。除了25次调用setColumnHidden()函数,还有其他方法吗 model = QSqlTableModel(self) model.setTable("table") ... view = QTableView() view.setModel(model) ... #insane: view.setColumnHidden(0, True) view.setColumnHidden(4

假设我有一个包含30列的表,并且希望使用QSqlTableModel/QTableView,只显示5列。除了25次调用setColumnHidden()函数,还有其他方法吗

model = QSqlTableModel(self)
model.setTable("table")
...
view = QTableView()
view.setModel(model)
...
#insane:
view.setColumnHidden(0, True)
view.setColumnHidden(4, True)
view.setColumnHidden(6, True)
view.setColumnHidden(7, True)
view.setColumnHidden(9, True)
view.setColumnHidden(10, True)
view.setColumnHidden(11, True)
...
view.setColumnHidden(29, True)
若DBA添加了一些我不想让用户看到的新列呢。对所有已安装的应用进行更改以添加一些新的view.setColumnHidden(n,True)行?不太实际


也许有一些Qt函数,比如view.setColumnsShown([1,2,3,5,8]),我不知道?

我想没有这个函数,但是如果你想自动完成,你可以编写你自己的函数或代码片段,它可以根据你的需要工作。不幸的是,我不熟悉Qt+Python,但C++中可以用这个代码来完成。这是一些循环,所以我认为您可以使用Python语法编写相同的代码。我还写了一些注释,以说明这段代码是如何工作的

QList<int> list;//create list where we set number of columns to be shown
list<< 1<<2;//write in list numbers of columns
    int c = ui->tableView->model()->columnCount();//get count of columns
    for (int i = 0; i < c; ++i)
    {
        ui->tableView->setColumnHidden(i,true);//hide all columns
    }
    for (int i = 0; i < list.length(); ++i)
    {
        if(list.at(i) < c)
            ui->tableView->setColumnHidden(list.at(i),false);//show columns which we want
    }
QList列表//创建列表,在其中设置要显示的列数
listcolumnCount()//获取列的计数
对于(int i=0;itableView->setColumnHidden(i,true);//隐藏所有列
}
对于(int i=0;itableView->setColumnHidden(list.at(i),false);//显示我们想要的列
}

您可以定义自己的
setColumnsShown()
函数:

from sets import Set

def setColumnsShown(view, showcols):
    allcols = Set(range(0, view.model().columnCount()))
    for col in allcols.difference(showcols):
        view.setColumnHidden(col, True)

要处理可能添加新列的情况,可以将
QSqlTableModel
的信号连接到重新调用
setColumnsShown

的处理函数嗨,好吧,QSqlTableModel确实有用,但在您的情况下,我不确定它是否是最佳选择。您使用这个类,但是您只想显示模型的12%,并且您担心如果出现新列会发生什么。也许您应该使用QStandardItemModel并只选择要显示的列?完全由您来编写正确的SQL查询,以选择数据库中所需的内容,这可能会更快。好的,但是在SQL数据库中使用QStandarItemModel吗?怎么做,为什么?你是对的,替代方案是使用QSqlQueryModel。如何做到这一点,QStandardItem模型可以被视为QStandardItem的矩阵。因此,您可以使用
QStandardItemModel::setItem(int行、int列、QStandardItem*item)
。在每个项目中,您都会放置一个数据库数据。为什么这么做?对模型进行全面控制并提高效率(我从未在这两种技术之间进行过性能测试,所以我不确定这一点)。唯一的缺点是没有编写
model.setTable(“table”)
,您必须编写更多的代码行来创建您的模型(大约20行,带有一个循环给您一个想法)。谢谢,您的代码与Chernobyl的类似,但非常优雅(py风格)。我喜欢。我接受这个答案。谢谢你的回答。我认为对于PyQT开发者来说,阅读和理解C++代码应该是必须的,所以代码中没有任何问题是C++的。不幸的是,我的代表人数很少,所以不能给你投票。