python - PyQt5如何给tablewidget添加点击事件?除了tablewidget还有什么具有scroll?
巴扎黑
巴扎黑 2017-04-18 09:03:56
0
1
1419

1.tableWidget怎么控制大小,能否用label来替代?
2.如何添加动作,点击目录后导出内容?
3.通过setColumnStretch设置的列宽,在目录导出后,约束失效了,这是为什么?

import sys
from PyQt5.QtWidgets import *
import urllib.request as request
import Spider

class MainScene(QWidget):
    def __init__(self):
        super().__init__()
        self.contextGrid()
        self.show()

    def contextGrid(self):
        self.resize(500,300);

        self.grid = QGridLayout()
        self.setLayout(self.grid)

        self.novelNameEdit = QLineEdit("http://xs.dmzj.com/2012/index.shtml")
        self.searchBtn = QPushButton("Search")
        self.blankLabel = QLabel("")
        self.novelText = QLabel("Content")

        self.grid.addWidget(self.novelNameEdit,0,0,1,1)
        self.grid.addWidget(self.searchBtn,0,1,1,1)
        self.grid.addWidget(self.blankLabel,0,2,1,3)
        self.grid.addWidget(self.novelText,1,1,1,4)

        self.grid.setColumnStretch(1,1)
        self.grid.setColumnStretch(2,1)
        self.grid.setColumnStretch(3,3)

        self.searchBtn.clicked.connect(self.searchBtnClick)

    def searchBtnClick (self):
        pass
        Sp = Spider.Catalogue()
        content = request.urlopen(self.novelNameEdit.text()).read()
        content = str(content, 'utf-8')
        Sp.feed(content)
        Sp.close()

        catalogueCount = len(Sp.catalogueList)

        tableWidget = QTableWidget(catalogueCount,1)
        tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)

        for ca in range(catalogueCount):
            tableWidget.setItem(ca,0,QTableWidgetItem(Sp.catalogueList[ca]))

        self.grid.addWidget(tableWidget, 1, 0, 1, 1)

if __name__ == "__main__":
    App = QApplication(sys.argv)
    MS = MainScene()
    sys.exit(App.exec_())

Spider.py

# -*- coding:utf-8 -*-
import html.parser as Pa

class Catalogue(Pa.HTMLParser):
    a_t = False
    alt = ""
    title = ""
    catalogueList = []

    def handle_data(self, data):
        if self.a_t is True:
            self.catalogueList.append(data)

    def handle_starttag(self, tag, attrs):
        if str(tag).startswith("a"):
            for key,value in attrs:
                if key == "alt":
                    self.alt = value
                elif key == "title":
                    self.title = value
                elif key == "href" and (value.find("/2012/")) == 0 and (value.find("index.")) == -1 and (value.find(".txt")) == -1:
                    self.a_t = True
                else:
                    self.a_t = False

    def handle_endtag(self, tag):
        if tag == "a":
            self.a_t=False



class NovelText(Pa.HTMLParser):
    a_t = False

    def handle_starttag(self, tag, attrs):
        if str(tag).startswith("p"):
            for key,value in attrs:
                if value == "novel_text":
                    self.a_t = True
                    break;
                else:
                    self.a_t = False

    def handle_data(self, data):
        if self.a_t is True:
            print(data)
巴扎黑
巴扎黑

répondre à tous(1)
刘奇

1) Vous ne pouvez pas utiliser label à la place, ce n'est pas la même chose après tout
3) Voir la description de setColumnStretch
Définit le facteur d'étirement de la colonne pour s'étirer La première colonne est le numéro 0.
Le facteur d'étirement est relatif aux autres colonnes de cette grille. Les colonnes avec un facteur d'étirement plus élevé occupent plus d'espace disponible.
Le facteur d'étirement par défaut est 0. Si le facteur d'étirement est 0 et qu'aucune autre colonne ne se trouve dans la grille. cette table peut s'agrandir, la colonne peut encore s'agrandir.
Une approche alternative consiste à ajouter un espacement en utilisant addItem() avec un QSpacerItem.

2) Je pense que votre utilisation de tableWidget n'est pas standardisée. Il est recommandé d'en faire une variable membre
self.tableWidget = None
Initialisez ensuite le contextGrid, puis ajoutez-y dynamiquement des données en fonction de le nombre d'articles.

importer le système
à partir de l'importation PyQt5.QtWidgets *
à partir de l'importation PyQt5.QtWidgets *
importer urllib.request en tant que demande
importer une araignée


classe MyTableWidget(QTableWidget) :
    def __init__(soi) :
        super().__init__()
        self.setMinimumWidth(400)
        self.setColumnCount(1)
        self.setColumnWidth(0, 400)
        self.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.itemClicked.connect(self.handleItemClick)

    def handleItemClick (soi, élément):
        imprimer(article.text())


classe MainScene(QWidget) :
    def __init__(self, parent=Aucun) :
        super().__init__()
        self.grid = QGridLayout()
        self.setLayout(self.grid)
        self.novelNameEdit = QLineEdit("http://xs.dmzj.com/2012/index.shtml")
        self.searchBtn = QPushButton("Recherche")
        self.novelText = QLabel("Contenu")
        self.tableWidget = MonTableWidget()

        self.grid.addWidget(self.novelNameEdit, 0, 0, 1, 2)
        self.grid.addWidget(self.searchBtn, 0, 2, 1, 1)
        self.grid.addWidget(self.tableWidget, 1, 0, 2, 2)
        self.grid.addWidget(self.novelText, 1, 2, 1, 1)
        self.resize(1024, 600)
        self.searchBtn.clicked.connect(self.searchBtnClick)

    def searchBtnClick (auto):
        self.tableWidget.clear()
        Sp = Spider.Catalogue()
        content = request.urlopen(self.novelNameEdit.text()).read()
        contenu = str(contenu, 'utf-8')
        Sp.feed (contenu)
        Sp.close()
        catalogCount = len(Sp.catalogueList)
        self.tableWidget.setRowCount(catalogueCount)
        pour l'index, élément dans enumerate (Sp.catalogueList) :
            self.tableWidget.setItem(index, 0, QTableWidgetItem(élément))


si __name__ == "__main__":
    Application = QApplication (sys.argv)
    MS = Scène principale()
    MS.show()
    sys.exit(App.exec_())
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal