GVKun编程网logo

如何在pyside / pyqt / qt中获取QWidget的所有子组件?(pyqt5获取qtablewidget内容)

10

在本文中,我们将为您详细介绍如何在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内容)

如何在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的模糊效果

c – 在Qt中对QWidget的模糊效果

有没有办法模糊Qt中的小部件?例如,supose我想创建一个’Loading …’对话框并模糊背景(非活动窗口).

解决方法

这个答案是我的一系列与叠加相关的答案: first,second,third.

如果您希望它可以在所有平台上运行,则需要一些小心.您无法直接将效果应用于顶级窗口.层次结构需要如下所示:

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

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_())
View Code

从代码总结的思路和注意点是:

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非常慢

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

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_()

 

运行结果如下:

其中的 QtreeWidgetItem就是一一的添加的,其实还是不太方便的。
在应用程序中一般不是这样来创建 QTreeView的,特别是比较复杂的Tree,一般都是通过QTreeView来实现而不是QTreeWidget来实现的。
这种与 QTreeWidget最大的区别就是,我们自己来定制模式,当然也有些系统提供给我们的模式,比如我们的文件系统盘的树列表,比如下面的:
 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_())

 运行结果如下:

 
一般的话model = TreeModel(需要处理的数据)可以让我们自己定制如何显示数据,其中的TreeModel类是我们自己写的,可以查阅相关资料。

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

本文标签: