Latest posts on PyQt5, выделение / выбор в QListView topichttp://python.su/forum/topic/38313/2020-01-14T11:59:27+02:00Общий :: GUI :: PyQt5, выделение / выбор в QListView
2020-01-14T11:59:27+02:00arancare206718переделал без QStandardItemModel<br/><br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">PyQt5</span> <span class="kn">import</span> <span class="n">QtWidgets</span><span class="p">,</span> <span class="n">QtCore</span><span class="p">,</span> <span class="n">QtGui</span>
<span class="kn">import</span> <span class="nn">tkinter</span>
<span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"text "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">_</span><span class="p">)</span><span class="o">.</span><span class="n">rjust</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="s1">'0'</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">211</span><span class="p">)]</span>
<span class="n">values_select</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">combobox_change_text</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="n">list_widget_filling</span><span class="p">()</span>
<span class="n">list_widget_select</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">list_widget_filling</span><span class="p">():</span>
<span class="n">list_widget</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">_</span><span class="p">:</span> <span class="n">combobox</span><span class="o">.</span><span class="n">currentText</span><span class="p">()</span> <span class="ow">in</span> <span class="n">_</span><span class="p">,</span> <span class="n">values</span><span class="p">)):</span>
<span class="n">list_widget</span><span class="o">.</span><span class="n">addItem</span><span class="p">(</span><span class="n">_</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">list_widget_clicked</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">data</span><span class="p">()</span> <span class="ow">in</span> <span class="n">values_select</span><span class="p">:</span>
<span class="k">del</span><span class="p">(</span><span class="n">values_select</span><span class="p">[</span><span class="n">values_select</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">data</span><span class="p">())])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">values_select</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">data</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">list_widget_select</span><span class="p">():</span>
<span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">list_widget</span><span class="o">.</span><span class="n">count</span><span class="p">()):</span>
<span class="k">if</span> <span class="n">list_widget</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="n">index</span><span class="p">)</span><span class="o">.</span><span class="n">text</span><span class="p">()</span> <span class="ow">in</span> <span class="n">values_select</span><span class="p">:</span>
<span class="n">list_widget</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="n">index</span><span class="p">)</span><span class="o">.</span><span class="n">setSelected</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">QtWidgets</span><span class="o">.</span><span class="n">QApplication</span><span class="p">([])</span>
<span class="n">window</span> <span class="o">=</span> <span class="n">QtWidgets</span><span class="o">.</span><span class="n">QWidget</span><span class="p">()</span>
<span class="n">vbox</span> <span class="o">=</span> <span class="n">QtWidgets</span><span class="o">.</span><span class="n">QVBoxLayout</span><span class="p">()</span>
<span class="n">vbox</span><span class="o">.</span><span class="n">setContentsMargins</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">vbox</span><span class="o">.</span><span class="n">setSpacing</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">combobox</span> <span class="o">=</span> <span class="n">QtWidgets</span><span class="o">.</span><span class="n">QComboBox</span><span class="p">()</span>
<span class="n">vbox</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">combobox</span><span class="p">)</span>
<span class="n">combobox</span><span class="o">.</span><span class="n">addItems</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
<span class="n">combobox</span><span class="o">.</span><span class="n">setEditable</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
<span class="n">combobox</span><span class="o">.</span><span class="n">editTextChanged</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">combobox_change_text</span><span class="p">)</span>
<span class="n">list_widget</span> <span class="o">=</span> <span class="n">QtWidgets</span><span class="o">.</span><span class="n">QListWidget</span><span class="p">()</span>
<span class="n">list_widget</span><span class="o">.</span><span class="n">setSelectionMode</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">vbox</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">list_widget</span><span class="p">)</span>
<span class="n">list_widget</span><span class="o">.</span><span class="n">addItems</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
<span class="n">list_widget</span><span class="o">.</span><span class="n">clicked</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">list_widget_clicked</span><span class="p">)</span>
<span class="n">window</span><span class="o">.</span><span class="n">setLayout</span><span class="p">(</span><span class="n">vbox</span><span class="p">)</span>
<span class="n">window</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">()</span>
</pre></div>
Общий :: GUI :: PyQt5, выделение / выбор в QListView
2020-01-14T07:40:33+02:00arancare206711Не могу разобраться как тот же код реализовать из Tkinter в Qt, пока без понятия как выделить элементы QListView и как перехватывать нажатие клавиш в QComboBox (по крайней мере без создания подкласса QComboBox и обработки всех событий в event)<br/><br/>пример кода на Tkinter<br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">Tkinter</span> <span class="kn">import</span> <span class="n">Tk</span><span class="p">,</span> <span class="n">Frame</span><span class="p">,</span> <span class="n">Scrollbar</span><span class="p">,</span> <span class="n">Listbox</span>
<span class="kn">from</span> <span class="nn">ttk</span> <span class="kn">import</span> <span class="n">Combobox</span>
<span class="k">def</span> <span class="nf">listbox_select</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">widget</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">widget</span><span class="o">.</span><span class="n">nearest</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">y</span><span class="p">))</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values_select</span><span class="p">:</span>
<span class="k">del</span> <span class="n">values_select</span><span class="p">[</span><span class="n">values_select</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">value</span><span class="p">)]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">values_select</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">combobox_key_release</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">keycode</span> <span class="o">==</span> <span class="mi">13</span> <span class="ow">and</span> <span class="n">combobox</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="ow">and</span> <span class="n">combobox</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
<span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">combobox</span><span class="o">.</span><span class="n">get</span><span class="p">())</span>
<span class="n">values</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
<span class="n">listbox_filling</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">combobox_click</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="n">combobox</span><span class="p">[</span><span class="s1">'values'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">_</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">values</span> <span class="k">if</span> <span class="n">combobox</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="ow">in</span> <span class="n">_</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">listbox_filling</span><span class="p">():</span>
<span class="n">listbox</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s1">'end'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">text</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">_</span><span class="p">:</span> <span class="n">combobox</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="ow">in</span> <span class="n">_</span><span class="p">,</span> <span class="n">values</span><span class="p">)):</span>
<span class="n">listbox</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="s1">'end'</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
<span class="n">listbox_set_select</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">listbox_set_select</span><span class="p">():</span>
<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">text</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">listbox</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s1">'end'</span><span class="p">)):</span>
<span class="k">if</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">values_select</span><span class="p">:</span>
<span class="n">listbox</span><span class="o">.</span><span class="n">selection_set</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">index</span><span class="p">)</span>
<span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"text "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">_</span><span class="p">)</span><span class="o">.</span><span class="n">rjust</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="s1">'0'</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">201</span><span class="p">)]</span>
<span class="n">values_select</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">root</span> <span class="o">=</span> <span class="n">Tk</span><span class="p">()</span>
<span class="n">combobox</span> <span class="o">=</span> <span class="n">Combobox</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">values</span><span class="p">)</span>
<span class="n">combobox</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">side</span><span class="o">=</span><span class="s1">'top'</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="s1">'x'</span><span class="p">,</span> <span class="n">expand</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">combobox</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s1">'<1>'</span><span class="p">,</span> <span class="n">combobox_click</span><span class="p">)</span>
<span class="n">combobox</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s1">'<KeyRelease>'</span><span class="p">,</span> <span class="n">combobox_key_release</span><span class="p">)</span>
<span class="n">frame</span> <span class="o">=</span> <span class="n">Frame</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
<span class="n">frame</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">side</span><span class="o">=</span><span class="s1">'top'</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="s1">'both'</span><span class="p">,</span> <span class="n">expand</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">scroll</span> <span class="o">=</span> <span class="n">Scrollbar</span><span class="p">(</span><span class="n">frame</span><span class="p">)</span>
<span class="n">scroll</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">side</span><span class="o">=</span><span class="s1">'right'</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="s1">'y'</span><span class="p">,</span> <span class="n">expand</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">listbox</span> <span class="o">=</span> <span class="n">Listbox</span><span class="p">(</span><span class="n">frame</span><span class="p">,</span> <span class="n">selectmode</span><span class="o">=</span><span class="s1">'multiple'</span><span class="p">,</span> <span class="n">selectbackground</span><span class="o">=</span><span class="s1">'#f00'</span><span class="p">)</span>
<span class="n">listbox</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">side</span><span class="o">=</span><span class="s1">'left'</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="s1">'both'</span><span class="p">,</span> <span class="n">expand</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">listbox</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s2">"<1>"</span><span class="p">,</span> <span class="n">listbox_select</span><span class="p">)</span>
<span class="n">listbox</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s1">'<Enter>'</span><span class="p">,</span> <span class="n">listbox_filling</span><span class="p">())</span>
<span class="n">listbox_filling</span><span class="p">()</span>
<span class="n">scroll</span><span class="p">[</span><span class="s1">'command'</span><span class="p">]</span> <span class="o">=</span> <span class="n">listbox</span><span class="o">.</span><span class="n">yview</span>
<span class="n">listbox</span><span class="p">[</span><span class="s1">'yscrollcommand'</span><span class="p">]</span> <span class="o">=</span> <span class="n">scroll</span><span class="o">.</span><span class="n">set</span>
<span class="n">root</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div><br/>пример кода на Qt<br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">PyQt5</span> <span class="kn">import</span> <span class="n">QtWidgets</span><span class="p">,</span> <span class="n">QtCore</span><span class="p">,</span> <span class="n">QtGui</span>
<span class="kn">import</span> <span class="nn">tkinter</span>
<span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"text "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">_</span><span class="p">)</span><span class="o">.</span><span class="n">rjust</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="s1">'0'</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">211</span><span class="p">)]</span>
<span class="n">values_select</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">combobox_change_text</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="n">sti_filling</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">sti_filling</span><span class="p">():</span>
<span class="n">sti</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">_</span><span class="p">:</span> <span class="n">combobox</span><span class="o">.</span><span class="n">currentText</span><span class="p">()</span> <span class="ow">in</span> <span class="n">_</span><span class="p">,</span> <span class="n">values</span><span class="p">)):</span>
<span class="n">sti</span><span class="o">.</span><span class="n">appendRow</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QStandardItem</span><span class="p">(</span><span class="n">_</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">list_view_clicked</span><span class="p">(</span><span class="n">index</span><span class="p">):</span>
<span class="n">item</span> <span class="o">=</span> <span class="n">sti</span><span class="o">.</span><span class="n">itemFromIndex</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
<span class="k">if</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">values_select</span><span class="p">:</span>
<span class="k">del</span><span class="p">(</span><span class="n">values_select</span><span class="p">[</span><span class="n">values_select</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">item</span><span class="p">)])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">values_select</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_list_view_clicked</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">data</span><span class="p">()</span> <span class="ow">in</span> <span class="n">values_select</span><span class="p">:</span>
<span class="k">del</span><span class="p">(</span><span class="n">values_select</span><span class="p">[</span><span class="n">values_select</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">data</span><span class="p">())])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">values_select</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">data</span><span class="p">())</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">QtWidgets</span><span class="o">.</span><span class="n">QApplication</span><span class="p">([])</span>
<span class="n">window</span> <span class="o">=</span> <span class="n">QtWidgets</span><span class="o">.</span><span class="n">QWidget</span><span class="p">()</span>
<span class="n">vbox</span> <span class="o">=</span> <span class="n">QtWidgets</span><span class="o">.</span><span class="n">QVBoxLayout</span><span class="p">()</span>
<span class="n">vbox</span><span class="o">.</span><span class="n">setContentsMargins</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">vbox</span><span class="o">.</span><span class="n">setSpacing</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">combobox</span> <span class="o">=</span> <span class="n">QtWidgets</span><span class="o">.</span><span class="n">QComboBox</span><span class="p">()</span>
<span class="n">vbox</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">combobox</span><span class="p">)</span>
<span class="n">combobox</span><span class="o">.</span><span class="n">addItems</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
<span class="n">combobox</span><span class="o">.</span><span class="n">setEditable</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
<span class="n">combobox</span><span class="o">.</span><span class="n">editTextChanged</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">combobox_change_text</span><span class="p">)</span>
<span class="n">list_view</span> <span class="o">=</span> <span class="n">QtWidgets</span><span class="o">.</span><span class="n">QListView</span><span class="p">()</span>
<span class="n">vbox</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">list_view</span><span class="p">)</span>
<span class="n">sti</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QStandardItemModel</span><span class="p">(</span><span class="n">parent</span><span class="o">=</span><span class="n">window</span><span class="p">)</span>
<span class="n">combobox</span><span class="o">.</span><span class="n">setCurrentText</span><span class="p">(</span><span class="s1">''</span><span class="p">)</span>
<span class="n">sti_filling</span><span class="p">()</span>
<span class="n">list_view</span><span class="o">.</span><span class="n">setModel</span><span class="p">(</span><span class="n">sti</span><span class="p">)</span>
<span class="n">list_view</span><span class="o">.</span><span class="n">setSelectionMode</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">list_view</span><span class="o">.</span><span class="n">clicked</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">list_view_clicked</span><span class="p">)</span>
<span class="n">window</span><span class="o">.</span><span class="n">setLayout</span><span class="p">(</span><span class="n">vbox</span><span class="p">)</span>
<span class="n">window</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">()</span>
</pre></div>