在本文中,我们将为您详细介绍如何在pyside/pyqt/qt中获取QWidget的所有子组件?的相关知识,并且为您解答关于pyqt5获取qtablewidget内容的疑问,此外,我们还会提供一些关于
在本文中,我们将为您详细介绍如何在pyside / pyqt / qt中获取QWidget的所有子组件?的相关知识,并且为您解答关于pyqt5获取qtablewidget内容的疑问,此外,我们还会提供一些关于c – 在Qt中对QWidget的模糊效果、PyQt PySide QListWidget 添加自定义 widget、PyQT QTableWidget非常慢、PyQt--QTreeWidget的有用信息。
本文目录一览:- 如何在pyside / pyqt / qt中获取QWidget的所有子组件?(pyqt5获取qtablewidget内容)
- c – 在Qt中对QWidget的模糊效果
- PyQt PySide QListWidget 添加自定义 widget
- PyQT QTableWidget非常慢
- PyQt--QTreeWidget
如何在pyside / pyqt / qt中获取QWidget的所有子组件?(pyqt5获取qtablewidget内容)
我正在使用pyside(qt)开发一个桌面应用程序,我想访问(迭代)QWidget的所有行编辑组件。在qt中,我找到了两个方法 findChild 和
findChildren, 但是没有找到合适的示例,并且我的代码显示错误, “ form”对象没有属性“ findChild”。
这里的“表单”是Qwidget表单,由lineEdit,组合框,Qpushbuttons等组件组成。
码:
lineEdits = form.findChild<QLineEdit>() //This is not working
lineEdits = form.findChild('QLineEdit) //This also not working
c – 在Qt中对QWidget的模糊效果
解决方法
如果您希望它可以在所有平台上运行,则需要一些小心.您无法直接将效果应用于顶级窗口.层次结构需要如下所示:
ContainerWidget | +----------+ | | **Target** Overlay
您将效果应用于Target小部件(例如,QMainWindow). ContainerWidget是一个帮助程序类,可以让子项占用窗口小部件的完整大小.这消除了对显式零边距布局的需要.
以下工作,甚至在Mac上.如果放弃了ContainerWidget,它就不会.不幸的是,这仅适用于Qt 5.在Qt 4上,你的“跨平台”支持不包括Mac :(它在Windows上使用Qt 4(4.8.5)或Qt 5正常工作.
// https://github.com/KubaO/stackoverflown/tree/master/questions/overlay-blur-19383427 #include <QtGui> #if QT_VERSION >= QT_VERSION_CHECK(5,0) #include <QtWidgets> #endif class OverlayWidget : public QWidget { void newParent() { if (!parent()) return; parent()->installEventFilter(this); raise(); } public: explicit OverlayWidget(QWidget *parent = {}) : QWidget(parent) { setAttribute(Qt::WA_NoSystemBackground); setAttribute(Qt::WA_TransparentForMouseEvents); newParent(); } protected: //! Catches resize and child events from the parent widget bool eventFilter(QObject *obj,QEvent *ev) override { if (obj == parent()) { if (ev->type() == QEvent::Resize) resize(static_cast<QResizeEvent*>(ev)->size()); else if (ev->type() == QEvent::ChildAdded) raise(); } return QWidget::eventFilter(obj,ev); } //! Tracks parent widget changes bool event(QEvent *ev) override { if (ev->type() == QEvent::ParentAbouttochange) { if (parent()) parent()->removeEventFilter(this); } else if (ev->type() == QEvent::ParentChange) newParent(); return QWidget::event(ev); } }; class ContainerWidget : public QWidget { public: explicit ContainerWidget(QWidget *parent = {}) : QWidget(parent) {} void setSize(QObject *obj) { if (obj->isWidgetType()) static_cast<QWidget*>(obj)->setGeometry(rect()); } protected: //! Resizes children to fill the extent of this widget bool event(QEvent *ev) override { if (ev->type() == QEvent::ChildAdded) { setSize(static_cast<QChildEvent*>(ev)->child()); } return QWidget::event(ev); } //! Keeps the children appropriately sized void resizeEvent(QResizeEvent *) override { for(auto obj : children()) setSize(obj); } }; class LoadingOverlay : public OverlayWidget { public: LoadingOverlay(QWidget *parent = {}) : OverlayWidget{parent} { setAttribute(Qt::WA_TranslucentBackground); } protected: void paintEvent(QPaintEvent *) override { QPainter p{this}; p.fillRect(rect(),{100,100,128}); p.setPen({200,200,255}); p.setFont({"arial,helvetica",48}); p.drawText(rect(),"Loading...",Qt::AlignHCenter | Qt::AlignTop); } }; namespace compat { #if QT_VERSION >= QT_VERSION_CHECK(5,4,0) using QT_PREPEND_NAMESPACE(QTimer); #else using Q_QTimer = QT_PREPEND_NAMESPACE(QTimer); class QTimer : public Q_QTimer { public: QTimer(QTimer *parent = nullptr) : Q_QTimer(parent) {} template <typename F> static void singleShot(int period,F &&fun) { struct Helper : public QObject { F fun; QBasicTimer timer; void timerEvent(QTimerEvent *event) override { if (event->timerId() != timer.timerId()) return; fun(); deleteLater(); } Helper(int period,F &&fun) : fun(std::forward<F>(fun)) { timer.start(period,this); } }; new Helper(period,std::forward<F>(fun)); } }; #endif } int main(int argc,char *argv[]) { QApplication a{argc,argv}; ContainerWidget base; QLabel label("Dewey,Cheatem and Howe,LLC.",&base); label.setFont({"times,times new roman",32}); label.setAlignment(Qt::AlignCenter); label.setGraphicsEffect(new QGraphicsBlurEffect); LoadingOverlay overlay(&base); base.show(); compat::QTimer::singleShot(2000,[&]{ overlay.hide(); label.setGraphicsEffect({}); }); return a.exec(); }
PyQt PySide QListWidget 添加自定义 widget
PyQt PySide QListWidget 添加自定义 widget
原文链接:https://stackoverflow.com/questions/25187444/pyqt-qlistwidget-custom-items
参考链接:https://www.cnblogs.com/weizhixiang/p/5913775.html
前言:
QListWidget 的 addItem(''item'') 只是快速的往 list 里面添加文本 item,有时候我们会希望添加自定义的 widget,那么就会用到 addItem ( QListWidgetItem * item ),也就是说 addItem 参数只接受 QString 和 QListWidgetItem,如果要添加自定义的 widget,那么就要把 QListWidgetItem 和 QWidget关联起来,方式是使用 QListWidget 的 setItemWidget(QListWidgetItem, QWidget),不过还要注意一些其它的设置(item 的 size)。
我根据原文链接稍微修改的代码(把图片改为按钮):
该代码可以直接运行,注意自己使用的是 PyQt4 还是 PySide


1 # -*- coding: utf-8 -*-
2
3 import sys
4 from PySide import QtGui
5 #from PyQt4 import QtGui
6
7 class QCustomQWidget (QtGui.QWidget):
8 def __init__ (self, parent = None):
9 super(QCustomQWidget, self).__init__(parent)
10 self.textQVBoxLayout = QtGui.QVBoxLayout()
11 self.textUpQLabel = QtGui.QLabel()
12 self.textDownQLabel = QtGui.QLabel()
13 self.textQVBoxLayout.addWidget(self.textUpQLabel)
14 self.textQVBoxLayout.addWidget(self.textDownQLabel)
15 self.allQHBoxLayout = QtGui.QHBoxLayout()
16 self.iconQLabel = QtGui.QPushButton()
17 self.allQHBoxLayout.addWidget(self.iconQLabel, 0)
18 self.allQHBoxLayout.addLayout(self.textQVBoxLayout, 1)
19 self.setLayout(self.allQHBoxLayout)
20 # setStyleSheet
21 self.textUpQLabel.setStyleSheet(''''''
22 color: rgb(0, 0, 255);
23 '''''')
24 self.textDownQLabel.setStyleSheet(''''''
25 color: rgb(255, 0, 0);
26 '''''')
27
28 def setTextUp (self, text):
29 self.textUpQLabel.setText(text)
30
31 def setTextDown (self, text):
32 self.textDownQLabel.setText(text)
33
34 def setIcon (self, imagePath):
35 pass
36 #self.iconQLabel.setPixmap(QtGui.QPixmap(imagePath))
37
38 class exampleQMainWindow (QtGui.QMainWindow):
39 def __init__ (self):
40 super(exampleQMainWindow, self).__init__()
41 # Create QListWidget
42 self.myQListWidget = QtGui.QListWidget(self)
43 for index, name, icon in [
44 (''No.1'', ''Meyoko'', ''icon.png''),
45 (''No.2'', ''Nyaruko'', ''icon.png''),
46 (''No.3'', ''Louise'', ''icon.png'')]:
47 # Create QCustomQWidget
48 myQCustomQWidget = QCustomQWidget()
49 myQCustomQWidget.setTextUp(index)
50 myQCustomQWidget.setTextDown(name)
51 myQCustomQWidget.setIcon(icon)
52 # Create QListWidgetItem
53 myQListWidgetItem = QtGui.QListWidgetItem(self.myQListWidget)
54 # Set size hint
55 myQListWidgetItem.setSizeHint(myQCustomQWidget.sizeHint())
56 # Add QListWidgetItem into QListWidget
57 self.myQListWidget.addItem(myQListWidgetItem)
58 self.myQListWidget.setItemWidget(myQListWidgetItem, myQCustomQWidget)
59 self.setCentralWidget(self.myQListWidget)
60
61 app = QtGui.QApplication([])
62 window = exampleQMainWindow()
63 window.show()
64 sys.exit(app.exec_())
从代码总结的思路和注意点是:
1. 创建 QListWidget
2. 创建 QListWidgetItem,父类为 QListWidget,可以理解为一个空的 item
3. 把 QListWidgetItem 添加到 QListWidget中:QListWidget.addItem(QListWidgetItem)
4. 创建 自定义的 QWidget
5. 把 QListWidgetItem 的 sizeHint 设置为 QWidget 的 sizeHint(如果不设置,看不到 QWidget)
6. 关联 QListWidgetItem 和 QWidget:QListWidget.setItemWidget(QListWidgetItem, QWidget)
运行结果:
PyQT QTableWidget非常慢
这是我用来填写QT
Designer中绘制的表格的代码。设计为对任何表通用,它可以正常工作,但是…当我尝试显示包含18列和〜12000行的datasat时,它冻结30秒或更长时间。因此,我做错了什么,有没有办法加快速度,保持代码仍然适合任何表?
那是我的代码:
...blablabla...
self.connect(self,SIGNAL("set"),self.real_set)
...blablabla...
def set_table(self,table,data):
self.emit(SIGNAL('set'),data)
def real_set(self,data):
"""
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Assuming data is list of dict and table is a QTableWidget.
Get first key and get len of contents
"""
for key in data:
rows = len(data[key])
table.setRowCount(rows)
break
"""
Forbid resizing(speeds up)
"""
table.horizontalHeader().setResizeMode(QHeaderView.Fixed)
table.verticalHeader().setResizeMode(QHeaderView.Fixed)
table.horizontalHeader().setStretchLastSection(False)
table.verticalHeader().setStretchLastSection(False)
"""
Set number of columns too
"""
table.setColumnCount(len(data))
table.setHorizontalHeaderLabels(sorted(data.keys()))
"""
Now fill data
"""
for n,key in enumerate(sorted(data.keys())):
for m,item in enumerate(data[key]):
newitem = QTableWidgetItem(item)
table.setItem(m,n,newitem)
PyQt--QTreeWidget
转载:loster_Li
QTreeWidget的继承关系如下图:
因为继承关系是 QAbstractItemView->QTreeView->QTreeWidget ,所以和QTableWidget很多地方是类似的。
如果需要特定的模式,如显示硬盘信息及内部文件的 dir模式等,都需要用QTreeView,而不是用 QTreeWidget。和 QTableWidget类似,一般步骤是先创建一个 QTreeWidget实例,然后设置列数,然后再添加 。
1 import sys
2 from PyQt4.QtGui import *
3
4
5 class TreeWidget(QMainWindow):
6 def __init__(self):
7 super(TreeWidget, self).__init__()
8 self.setWindowTitle(''TreeWidget'')
9 self.tree = QTreeWidget() # 实例化一个TreeWidget对象
10 self.tree.setColumnCount(2) # 设置部件的列数为2
11 self.tree.setHeaderLabels([''Key'', ''Value'']) # 设置头部信息对应列的标识符
12
13 # 设置root为self.tree的子树,故root是根节点
14 root = QTreeWidgetItem(self.tree)
15 root.setText(0, ''root'') # 设置根节点的名称
16
17 # 为root节点设置子结点
18 child1 = QTreeWidgetItem(root)
19 child1.setText(0, ''child1'')
20 child1.setText(1, ''name1'')
21 child2 = QTreeWidgetItem(root)
22 child2.setText(0, ''child2'')
23 child2.setText(1, ''name2'')
24 child3 = QTreeWidgetItem(root)
25 child3.setText(0, ''child3'')
26 child4 = QTreeWidgetItem(child3)
27 child4.setText(0, ''child4'')
28 child4.setText(1, ''name4'')
29
30 self.tree.addTopLevelItem(root)
31 self.setCentralWidget(self.tree) # 将tree部件设置为该窗口的核心框架
32
33 app = QApplication(sys.argv)
34 app.aboutToQuit.connect(app.deleteLater)
35 tp = TreeWidget()
36 tp.show()
37 app.exec_()
运行结果如下:
1 import sys
2 from PyQt4 import QtGui
3
4
5 # 直接运行程序时的入口
6 if __name__ == "__main__":
7 app = QtGui.QApplication(sys.argv)
8 app.aboutToQuit.connect(app.deleteLater)
9
10 model = QtGui.QDirModel() # Windows系统提供的模式
11 tree = QtGui.QTreeView() # 实例化一个QtreeView对象
12 tree.setModel(model) # 为部件添加模式
13 tree.setWindowTitle(tree.tr("Dir View"))
14 tree.resize(640, 480)
15 tree.show()
16 sys.exit(app.exec_())
运行结果如下:

今天关于如何在pyside / pyqt / qt中获取QWidget的所有子组件?和pyqt5获取qtablewidget内容的讲解已经结束,谢谢您的阅读,如果想了解更多关于c – 在Qt中对QWidget的模糊效果、PyQt PySide QListWidget 添加自定义 widget、PyQT QTableWidget非常慢、PyQt--QTreeWidget的相关知识,请在本站搜索。
本文标签: