Qt小部件的构造函数应该用来链接到父函数吗?

2024-04-26 23:18:24 发布

您现在位置:Python中文网/ 问答频道 /正文

由于同一个QListWidget的多个实例和所有实例都连接到同一个函数,我似乎可以通过移动来节省几行代码:

self.clicked.connect(self.parent().itemClicked)

它的构造函数。你知道吗

虽然它的工作,我想知道这样的做法是否会被认为是坏的?如果是,请解释原因:

enter image description here

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class ListWidget(QListWidget):
    def __init__(self, parent):
        super(ListWidget, self).__init__(parent)
        self.clicked.connect(self.parent().itemClicked)

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        layout=QVBoxLayout(self)
        self.setLayout(layout) 

        view=ListWidget(self) 
        view.addItems(['One','Two','Three']) 

        layout.addWidget(view)

    def itemClicked(self, index):
        print 'itemClicked', index

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

Tags: 实例fromimportselfviewinitdefconnect
1条回答
网友
1楼 · 发布于 2024-04-26 23:18:24

这种方法很糟糕,因为它在ListWidget类和其他具有itemClicked槽的类之间创建了额外的耦合。子类不应该知道其父类做什么。如果ListWidget是另一个小部件的子部件,而这个小部件没有itemClicked槽怎么办?你知道吗

我建议使用一个工厂函数来创建ListWidget并设置它的连接。我会把它写成(C++):

static ListWidget *createListWidget(MainWindow *parent)
{
    ListWidget *lw = new ListWidget(parent);
    connect(lw, SIGNAL(clicked(int)), parent, SLOT(itemClicked(int)));
    return lw;
}

class MainWindow : public QMainWindow
{
public:
    MainWindow()
    {
        [..]
        ListWidget *lw = createListWidget(this);
        lw->addItems(...);
        layout->addWidget(lw);
        [..]
    }
};

相关问题 更多 >