尝试用Tkinter的知识学习PyQt

6 投票
1 回答
1025 浏览
提问于 2025-04-17 01:31

也许我有点冒险,但我想试试。

以下是Tkinter的一些有用功能:

  • Tkinter的Canvas小部件是一个面向对象的绘图画布。画布上的元素本身就是小部件,因为它们可以移动、修改,并且可以绑定到事件

  • Tkinter使用绑定来触发回调。事件以字符串的形式传递。可以通过event_generate轻松创建自定义事件。

  • Tkinter有一个after方法,可以在不冻结图形界面的情况下等待指定的时间。

  • Tkinter有一些预定义的字体,比如TkDefaultFont,还有一些颜色,比如systemButtonFace,这些都是根据系统来决定的。

我的问题是:

这些功能在pyQt中对应的是什么(特别是加粗的那些)?

我如何将小部件的元素(例如,仅仅是复选按钮的标签)“绑定”到一个事件上?

1 个回答

1

在Qt和PyQt中,事件被称为信号,你可以通过槽来绑定这些信号(这里有相关文档)。简单来说,你需要用一个@装饰器来定义一个槽。

class WindowImpl (QtGui.QMainWindow, Ui_TremorMain, Ui_Graphs):
  def __init__ (self, buffer, parent = None, configuration = None):
    # do some initialisation here (not GUI setup however)

  @QtCore.pyqtSlot(int, name="on_confSelectorCombo_currentIndexChanged")
  def confChanged (self, newConf):
    # do some stuff here to handle the event

上面的代码会在一个叫confSelectorCombo的对象的currentIndexChanged事件触发时执行。confSelectorCombo的设置是在图形界面构建工具或者叫Qt Creator的地方完成的。这个工具非常适合新手入门。关于如何使用Qt Creator的教程可以在这里找到。当然,你也应该查看文档,了解哪些小部件会发出哪些信号。

至于字体的相关内容,我只知道文档上说的内容(这里有文档):

If you have not set a font for your application then the default font on your
machine will be used, and the default font can be different on different
machines. On Windows the default Windows font is used, on X11 the one in qtrc
can be used. If a default font can’t be found, then a font specified by Qt
will be used.

QStyleSheetQStyle可以用来改变小部件的外观(QStylesheet, QStyle)。

关于让应用程序等待的方式,我找到了一些信息,可以参考这个链接

QTime dieTime = QTime::currentTime().addSecs(2);
while( QTime::currentTime() < dieTime ):
  QCoreApplication::processEvents(QEventLoop::AllEvents, 100);

还有QThread.sleep()文档在这里),具体使用哪种方式取决于你想要的效果。你也可以看看Qt文档中的线程支持

总体来说,在寻找如何在PyQt中做事情的信息时,我发现查看Qt的文档,然后用Python编写代码是非常有用的。大约90%的情况下,这样做是有效的。另外,值得一提的是PySide,这是另一个Python的Qt库。我自己之前没有用过,因为它一直在开发中,但我注意到他们已经发布了1.0.6版本。

更新
为了重申一下下面的Luke Woodward,你可以使用QGraphicsSceneQGraphicsView以面向对象的方式来渲染内容。QGraphicsScene实际上并不渲染任何东西,它只是一个场景图,而QGraphicsView则用来渲染场景图的内容。对于低级绘图,还有QPainter - 这里有一个基本的绘图教程在这里。另外,QGraphicsItem是所有图形项的基础,值得了解一下。

includes defining the item's geometry, collision detection, its painting     
implementation and item interaction through its event handlers

文档在这里Context2D提供了一个HTML画布(如果我没记错的话,是通过WebKit实现的)。画布本身只有一个变化的槽,但你放在画布上的任何对象都可以有更多的槽。关于Context2DContext2DCanvas的教程看起来相当完整,可以在这里找到。至于为什么有这么多不同的渲染方式,你得问别人。我个人觉得这可能与Qt的设计初衷有关,它希望能在各种平台上运行,而Trolltech和后来的诺基亚想提供更多的选择。幸运的是,文档写得非常好。

撰写回答