小编ekh*_*oro的帖子

自定义绘制委托中的可单击元素或子窗口小部件

我有一个QListView,我使用自定义绘图显示项目.在每个项目(即每个列表行)中,我希望能够显示一些用户可以单击的"超链接",然后调用某些功能.

我已经尝试检查官方文档(例如模型/视图编程)以及相当多的谷歌搜索,但还没有弄清楚如何实现这一目标.

我有两个想法,每个都有自己的问题:

  • 我可以使用子小部件绘制它们,就像平面QPushButton一样.然后我如何定位和显示这些小部件?
  • 我也可以将它们绘制为文本字符串.然后如何使它们可点击?或者我可以捕获父QListView上的点击事件,并以某种方式确定那些坐标?然后我可以将坐标与这些可点击元素进行匹配并相应地采取行动

我最初的方法是使用QListWidget和.setItemWidget(),其中我有一个带有布局和子窗口小部件的正确小部件.不幸的是,当我的列表增加到数百或数千个项目时,这太慢了.这就是我用委托更改为QListView的原因.

qt qt4 qlistview qitemdelegate pyside

8
推荐指数
1
解决办法
1414
查看次数

PyQt - 如何使getOpenFileName记住最后的开放路径?

根据getOpenFileName说明:

QString fileName = QFileDialog.getOpenFileName(this, tr("Open File"), 
                                          "/home",
                                          tr("Images (*.png *.xpm *.jpg)"));
Run Code Online (Sandbox Code Playgroud)

当我关闭它时,如何让对话框记住最后一次的路径?

什么是tr意味着tr("Open File")什么?

谢谢

python pyqt qfiledialog

8
推荐指数
1
解决办法
2万
查看次数

如何在退出PyQt4应用程序时禁用清除剪贴板?

我有一个简单的PyQt4应用程序(请参阅下面的代码),它揭示了下一个问题:如果我从QLineEdit中选择文本并将其复制到剪贴板,那么我只能在我的应用程序运行时将其粘贴到另一个应用程序.似乎在退出时PyQt应用程序清除了剪贴板,因此我无法在应用程序关闭后粘贴文本.

我该怎么做才能避免这个问题?

PyQt 4.4.3 @ Python 2.5 @ Windows XP.此效果也在PyQt 4.5+和Linux上得到证实.

import sys
from PyQt4 import QtGui
app = QtGui.QApplication(sys.argv)
edit = QtGui.QLineEdit()
edit.setText('foo bar')
edit.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)

python clipboard qt pyqt

7
推荐指数
1
解决办法
1611
查看次数

如何在QTabWidget中更改文本对齐方式?

我找不到在QTabWidget中设置文本对齐方式.

在我创建了这个小部件的实例之后,我将其tabPosition属性设置为West,但我希望它在水平方向上显示文本/标签.我已经看了Qt的样式表,但正如你所看到的,text-align属性只能在QPushButton和QProgressBar上设置.

我已经在网上搜索了,但我刚发现了一个bug报告,一个未回答的问题,最后是一个建议重新实现paint()方法的用户.也许我会解决,但我使用Python(PyQt或PySide),我不知道该怎么做.

你能帮助我吗?

编辑:感谢Teukamm,我写了一些代码:

from PyQt4 import QtGui, QtCore

class HorizontalTabWidget(QtGui.QTabBar):
    def paintEvent(self, event):
        for index in range(self.count()):
            painter = QtGui.QPainter()
            painter.begin(self)
            painter.setPen(QtCore.Qt.blue);
            painter.setFont(QtGui.QFont("Arial", 10));
            tabRect = self.tabRect(index)
            painter.drawText(tabRect, QtCore.Qt.AlignVCenter | QtCore.Qt.TextDontClip, self.tabText(index));
            painter.end()

     def sizeHint(self):
         return QtCore.QSize(60, 130)

import sys
app = QtGui.QApplication(sys.argv)
tabs = QtGui.QTabWidget()
tabs.setTabBar(HorizontalTabWidget())
widget1 =  QtGui.QWidget()
widget2 =  QtGui.QWidget()
tabs.addTab(widget1, "Widget1")
tabs.addTab(widget2, "Widget2")
tabs.setTabPosition(2)
tabs.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

最后我的文本按照我的预期对齐,但我有一点(大?)问题:当你点击每个标签按钮的右侧时,它不会发送currentChanged SIGNAL.我还尝试在paintEvent中扩展每个tabRect的宽度,但它不起作用.我应该改变什么?

谢谢 :) …

qt qt4 pyqt4 pyside qtabwidget

7
推荐指数
2
解决办法
6921
查看次数

使用撇号的Python XPath解析标记

我是XPath的新手.我正在尝试使用XPath解析页面.我需要从标签中获取信息,但是标题中的撇号撇开了一切.

对于解析我使用Grab.

来自源代码:

<img src='somelink' border='0' alt='commission:Alfred\'s misadventures' title='commission:Alfred\'s misadventures'>
Run Code Online (Sandbox Code Playgroud)

实际XPath:

g.xpath('.//tr/td/a[3]/img').get('title')
Run Code Online (Sandbox Code Playgroud)

返回

commission:Alfred\\
Run Code Online (Sandbox Code Playgroud)

有没有什么办法解决这一问题?

谢谢

python xpath parsing apostrophe

7
推荐指数
1
解决办法
1519
查看次数

在Python中发送非ASCII POST请求?

我正在尝试向网络应用发送POST请求.我正在使用mechanize模块(本身是urllib2的包装器).无论如何,当我尝试发送POST请求时,我得到了UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128).我试图把unicode(string)unicode(string, encoding="utf-8"),unicode(string).encode()等等,没有什么工作-无论是返回的错误之上,或TypeError: decoding Unicode is not supported

我查看了类似问题的其他SO答案,但都没有帮助.

提前致谢!

编辑:产生错误的示例:

prda = "š???" #valid UTF-8 characters
prda # typing in python shell 
'\xc5\xa1\xc4\x91\xc4\x87\xc4\x8d'
print prda # in shell
š???
prda.encode("utf-8") #in shell
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128)
unicode(prda)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: …
Run Code Online (Sandbox Code Playgroud)

html python unicode post http

7
推荐指数
1
解决办法
5449
查看次数

PyQt窗口焦点

如果用户点击另一个窗口,我试图将焦点放在窗口上.

现在我有两个窗口:窗口A在后面,窗口B在前面.当Window B出现时,它会禁用Window A.现在我想要的是每当用户点击Window B之外时,它应该将焦点返回到Window B.

这是Window B的代码:

class window_b(QtGui.QDialog):
    def __init__(self,parent=None):
        super(window_b, self).__init__(parent)
        window_a.setEnabled(False)
        self.ui = Ui_Form_window_b()
        self.ui.setupUi(self)
        self.setFocusPolicy(QtCore.Qt.StrongFocus)

    def focusOutEvent(self,event):
        self.setFocus(True)
        self.activateWindow()
        self.raise_()
        self.show()
Run Code Online (Sandbox Code Playgroud)

我试过setFocusactivateWindow,但它没有把焦点返回到窗口B.

有什么建议?

python focus window pyqt pyqt4

7
推荐指数
2
解决办法
2万
查看次数

如何在pyqt中设置QThread的名称?

我正在使用QtCore.QThread(来自PyQt4).

要记录,我还使用以下格式化程序:

logging.Formatter('%(levelname)-8s %(asctime)s %(threadName)-15s %(message)s')

生成的日志是:

DEBUG 2012-10-01 03:59:31,479 Dummy-3 my_message

我的问题是我想更明确地知道哪个线程正在记录... Dummy-3对我来说不是最明确的名字....

有没有办法将一个名称设置为一个QtCore.QThread可供日志记录模块使用的名称(作为LogRecord属性),以使日志更有意义?

谢谢 !

python multithreading pyqt qthread

7
推荐指数
1
解决办法
1390
查看次数

如何以编程方式简单地删除QFormLayout中的行

我有这个代码:

myEdit = QLineEdit()
myQFormLayout.addRow("myLabelText", myEdit)
Run Code Online (Sandbox Code Playgroud)

现在我必须通过引用删除行myEdit:

myQformLayout.removeRow(myEdit)
Run Code Online (Sandbox Code Playgroud)

但是没有API.我可以使用.takeAt(),但我怎么能得到这个论点?如何找到标签索引或索引myEdit

layout qt pyqt

7
推荐指数
1
解决办法
6970
查看次数

QWidget不绘制背景颜色

我在Python 2.7中使用PySide 1.2.1,我需要一个小部件来绘制彩色背景.在Qt Designer中,我创建了一个简单的窗口,其中包含一个标签,一个包含三个其他项目和另一个标签的小部件.对于包含按钮的小部件,单选按钮和复选框我将styleSheet属性设置为background-color: #FFFFFF.在Qt Designer中,所有内容都根据需要呈现:

Qt Designer中的窗口

但是在Pyside中,小部件不会绘制背景颜色 - 但是它上面的项目会正确地继承颜色:

PySide中的窗口

这是ui-XML:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>276</width>
    <height>133</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QVBoxLayout" name="verticalLayout" stretch="0,1,1">
    <item>
     <widget class="QLabel" name="label">
      <property name="text">
       <string>The following should have white background:</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QWidget" name="widget" native="true">
      <property name="styleSheet">
       <string notr="true">background-color: #FFFFFF</string>
      </property>
      <layout class="QHBoxLayout" name="horizontalLayout">
       <item>
        <widget class="QPushButton" name="pushButton">
         <property name="text">
          <string>PushButton</string>
         </property> …
Run Code Online (Sandbox Code Playgroud)

python background-color qwidget pyside qtstylesheets

7
推荐指数
1
解决办法
2968
查看次数