Qt Widget 的构造函数应该用于 link 到父函数吗?
Should be Qt Widget's constructor used to link to a parent function?
同一个 QListWidget
的多个实例和所有实例都连接到同一个函数,看来我可以通过移动来节省几行代码:
self.clicked.connect(self.parent().itemClicked)
到它的构造函数。
虽然它有效,但我想知道这样的做法是否会被认为是不好的?如果是,请解释原因:
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_())
这种方法很糟糕,因为它 在 ListWidget
class 和其他 class 与 itemClicked
插槽之间创建了额外的耦合 。 Child class 不应该知道它的 parent 是做什么的。如果 ListWidget
是另一个没有 itemClicked
插槽的小部件的 child 怎么办?
我建议使用一个工厂函数来创建一个 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);
[..]
}
};
同一个 QListWidget
的多个实例和所有实例都连接到同一个函数,看来我可以通过移动来节省几行代码:
self.clicked.connect(self.parent().itemClicked)
到它的构造函数。
虽然它有效,但我想知道这样的做法是否会被认为是不好的?如果是,请解释原因:
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_())
这种方法很糟糕,因为它 在 ListWidget
class 和其他 class 与 itemClicked
插槽之间创建了额外的耦合 。 Child class 不应该知道它的 parent 是做什么的。如果 ListWidget
是另一个没有 itemClicked
插槽的小部件的 child 怎么办?
我建议使用一个工厂函数来创建一个 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);
[..]
}
};