2

システムトレイにアイコンを作成するプログラムを作成し、マウスの右ボタンをクリックすると、[メモ]、[新しいメモの作成]、[終了]の3つのポイントのコンテキストメニューが表示されます。メニューを押すと、[新しいメモの作成]フォームが表示されますが、表示されません。 。なんで?

from PyQt4 import QtCore, QtGui, uic
import sys

class NoteForm(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        uic.loadUi("note.ui", self)

def main():
    app = QtGui.QApplication(sys.argv)

    tray = QtGui.QSystemTrayIcon()
    icon = app.style().standardIcon(QtGui.QStyle.SP_DesktopIcon)
    tray.setIcon(icon)
    tray.show()
    CreateMenu(tray, app)
    sys.exit(app.exec_())

def CreateMenu(tray, app):
    m1 = QtGui.QMenu("Menu 1")
    m2 = QtGui.QMenu("Notes", m1)
    actNewNote=QtGui.QAction("Create new note", m1)
    actNewNote.triggered.connect(viewNote)
    #m1.addAction("Create new note", viewNote)
    m1.addMenu(m2)
    m1.addSeparator()
    m1.addAction("Quit", app.quit)
    tray.setContextMenu(m1)

def viewNote():
    note=NoteForm()
    note.show()


if __name__ == '__main__':
    main()

note.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>WindowNote</class>
 <widget class="QDialog" name="WindowNote">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>707</width>
    <height>356</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Заметка</string>
  </property>
  <widget class="QWidget" name="">
   <property name="geometry">
    <rect>
     <x>20</x>
     <y>10</y>
     <width>671</width>
     <height>331</height>
    </rect>
   </property>
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0" colspan="3">
     <widget class="QLineEdit" name="TitleNote"/>
    </item>
    <item row="1" column="0" colspan="3">
     <widget class="QTextEdit" name="textNote"/>
    </item>
    <item row="2" column="0">
     <widget class="QPushButton" name="buttonOK">
      <property name="text">
       <string>OK</string>
      </property>
     </widget>
    </item>
    <item row="2" column="1">
     <widget class="QPushButton" name="buttonCancel">
      <property name="text">
       <string>Отмена</string>
      </property>
     </widget>
    </item>
    <item row="2" column="2">
     <widget class="QPushButton" name="buttonDeleteNote">
      <property name="text">
       <string>Удалить заметку</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>
4

2 に答える 2

1

関数は、それが作成viewNoteするインスタンスへの参照を保存しません。関数はブロックせずにすぐに戻るため、ダイアログは表示された直後にガベージ コレクションされますNoteFormshow()

これを修正するには、exec_を使用してダイアログを実行するか、グローバル参照を保持します。

def viewNote():
    note = NoteForm()
    note.exec_()

また:

def viewNote():
    global note
    note = NoteForm()
    note.show()
于 2012-12-01T17:24:23.537 に答える
0

を追加する必要がQDialog.exec_()ありviewNote()ます。また、Create new Noteアクションを有効にします。だからこのように:

def CreateMenu(tray, app):
    m1 = QtGui.QMenu("Menu 1")
    m2 = QtGui.QMenu("Notes", m1)
    actNewNote=QtGui.QAction("Create new note", m1)
    actNewNote.triggered.connect(viewNote)
    m1.addAction("Create new note", viewNote)
    m1.addMenu(m2)
    m1.addSeparator()
    m1.addAction("Quit", app.quit)
    tray.setContextMenu(m1)

def viewNote():
    note=NoteForm()
    note.show()
    note.exec_()

または、グローバルとして渡すことができるnoteので、次のようになります。

def viewNote():
    global note
    note = NoteForm()
    note.show()
于 2012-12-01T17:18:46.607 に答える