- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
让这个小片段:
import sys
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5.QtWidgets import QMenu
from PyQt5.QtGui import QKeySequence
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QGraphicsObject
from PyQt5.QtCore import QRectF
from PyQt5.QtGui import QBrush
from PyQt5.QtCore import QPoint
from PyQt5.QtGui import QLinearGradient
from PyQt5.QtGui import QColor
from PyQt5.QtGui import QPen
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QGraphicsTextItem
from PyQt5.QtWidgets import QGraphicsItem
def create_action(parent, text, slot=None,
shortcut=None, shortcuts=None, shortcut_context=None,
icon=None, tooltip=None,
checkable=False, checked=False):
action = QtWidgets.QAction(text, parent)
if icon is not None:
action.setIcon(QIcon(':/%s.png' % icon))
if shortcut is not None:
action.setShortcut(shortcut)
if shortcuts is not None:
action.setShortcuts(shortcuts)
if shortcut_context is not None:
action.setShortcutContext(shortcut_context)
if tooltip is not None:
action.setToolTip(tooltip)
action.setStatusTip(tooltip)
if checkable:
action.setCheckable(True)
if checked:
action.setChecked(True)
if slot is not None:
action.triggered.connect(slot)
return action
class Settings():
WIDTH = 20
HEIGHT = 15
NUM_BLOCKS_X = 32
NUM_BLOCKS_Y = 16
class CI(QGraphicsTextItem):
def __init__(self, text, pos):
QGraphicsTextItem.__init__(self)
self.content = text
self.setPlainText(text)
self.setPos(pos)
self.setTextInteractionFlags(Qt.TextEditorInteraction)
self.setDefaultTextColor(Qt.black)
self.setFlags(
self.flags() | QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsSelectable)
self.setZValue(-1)
def paint(self, painter, option, widget):
painter.save()
painter.setBrush(QBrush(Qt.white))
painter.drawRect(self.boundingRect())
painter.restore()
super().paint(painter, option, widget)
def keyPressEvent(self, event):
super().keyPressEvent(event)
self.content = self.toPlainText()
def focusInEvent(self, event):
self.scene().writing_comment = True
# self.setPlainText(self.content)
# print("Focusinevent")
def focusOutEvent(self, event):
self.scene().writing_comment = False
# self.setHtml(self.content)
# print("FocusOutevent")
def contextMenuEvent(self, scme):
super().contextMenuEvent(scme)
class QS(QtWidgets.QGraphicsScene):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
width = Settings.NUM_BLOCKS_X * Settings.WIDTH
height = Settings.NUM_BLOCKS_Y * Settings.HEIGHT
self.setSceneRect(0, 0, width, height)
self.setItemIndexMethod(QtWidgets.QGraphicsScene.NoIndex)
pos = QPoint(
5 * Settings.WIDTH,
2 * Settings.HEIGHT
)
content = """<!DOCTYPE html>
<html>
<body>
<h1>This is heading 1</h1>
<h2>This is heading 2</h2>
<h3>This is heading 3</h3>
<h4>This is heading 4</h4>
<h5>This is heading 5</h5>
<h6>This is heading 6</h6>
</body>
</html>
"""
self.addItem(CI(content, pos))
class QV(QtWidgets.QGraphicsView):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.view_menu = QMenu(self)
self.create_actions()
def create_actions(self):
act = create_action(self.view_menu, "Zoom in",
slot=self.on_zoom_in,
shortcut=QKeySequence("+"), shortcut_context=Qt.WidgetShortcut)
self.view_menu.addAction(act)
act = create_action(self.view_menu, "Zoom out",
slot=self.on_zoom_out,
shortcut=QKeySequence("-"), shortcut_context=Qt.WidgetShortcut)
self.view_menu.addAction(act)
self.addActions(self.view_menu.actions())
def on_zoom_in(self):
if not self.scene():
return
self.scale(1.5, 1.5)
def on_zoom_out(self):
if not self.scene():
return
self.scale(1.0 / 1.5, 1.0 / 1.5)
def drawBackground(self, painter, rect):
painter.setRenderHint(QPainter.Antialiasing, True)
gr = rect.toRect()
start_x = gr.left() + Settings.WIDTH - (gr.left() % Settings.WIDTH)
start_y = gr.top() + Settings.HEIGHT - (gr.top() % Settings.HEIGHT)
painter.save()
for index, x in enumerate(range(start_x, gr.right(), Settings.WIDTH)):
if index == Settings.NUM_BLOCKS_X:
painter.setPen(QtGui.QColor(255, 70, 80).lighter(90))
painter.setOpacity(0.7)
else:
painter.setPen(QtGui.QColor(60, 70, 80).lighter(90))
painter.setOpacity(0.7)
painter.drawLine(x, gr.top(), x, gr.bottom())
for index, y in enumerate(range(start_y, gr.bottom(), Settings.HEIGHT)):
if index == Settings.NUM_BLOCKS_Y:
painter.setPen(QtGui.QColor(255, 70, 80).lighter(90))
painter.setOpacity(0.7)
else:
painter.setPen(QtGui.QColor(60, 70, 80).lighter(90))
painter.setOpacity(0.7)
painter.drawLine(gr.left(), y, gr.right(), y)
painter.restore()
super().drawBackground(painter, rect)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
a = QS()
b = QV()
b.setScene(a)
print(b.mapToScene(b.rect()))
b.show()
sys.exit(app.exec_())
如果我们运行它,我们会看到它正在创建一个带有网格和 QGraphicsTextItem 的小场景,如下所示:
我在这里想弄清楚的是如何在网格交叉点上捕捉 QGraphicsTextItem 每次移动它或调整它的大小(当我写一些文本时),我怎么能保证?这是一张小图片,可以更好地解释我想要什么:
最佳答案
要设置QGraphicsTextItem
的新宽度和高度,您可以覆盖boundingRect()
,到setPos()
,您可以使用任何适当的事件,例如 MouseReleaseEvent
或 MouseMoveEvent
,并从最后一个 pos()
计算下一个左上角网格交点:
class CI(QGraphicsTextItem):
def __init__(self, text, pos):
QGraphicsTextItem.__init__(self)
self.content = text
self.setPlainText(text)
self.setPos(pos)
self.setTextInteractionFlags(Qt.TextEditorInteraction)
self.setDefaultTextColor(Qt.black)
self.setFlags(
self.flags() | QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsSelectable)
self.setZValue(-1)
def boundingRect(self):
# get the original width and height of boundingrect
br = QGraphicsTextItem.boundingRect(self)
brw = br.width()
brh = br.height()
# new width and height in "blocks"
wblocks = int(brw/Settings.WIDTH) + 1
hblocks = int(brh/Settings.HEIGHT) + 1
w = wblocks*Settings.WIDTH
h = hblocks*Settings.HEIGHT
return QtCore.QRectF(0, 0, w, h)
def mouseReleaseEvent(self, event):
# QGraphicsItem.mouseReleaseEvent(self, event)
QGraphicsTextItem.mouseReleaseEvent(self, event)
self.setGridIntersection(self.pos())
def mouseMoveEvent(self, event):
QGraphicsTextItem.mouseMoveEvent(self, event)
self.setGridIntersection(self.pos())
def setGridIntersection(self, pos):
# get the next grid intersection top left of items top-left corner
grid_x = int(pos.x()/Settings.WIDTH)
grid_y = int(pos.y()/Settings.HEIGHT)
self.setPos(grid_x*Settings.WIDTH, grid_y*Settings.HEIGHT)
def paint(self, painter, option, widget):
painter.save()
painter.setBrush(QBrush(Qt.white))
painter.drawRect(self.boundingRect())
painter.restore()
super().paint(painter, option, widget)
def keyPressEvent(self, event):
super().keyPressEvent(event)
self.content = self.toPlainText()
def focusInEvent(self, event):
self.scene().writing_comment = True
# self.setPlainText(self.content)
# print("Focusinevent")
def focusOutEvent(self, event):
self.scene().writing_comment = False
# self.setHtml(self.content)
# print("FocusOutevent")
def contextMenuEvent(self, scme):
super().contextMenuEvent(scme)
编辑 01.02.17:上面的解决方案只适用于单选,单选和多选都可以使用:
class CI(QGraphicsTextItem):
def __init__(self, text, pos):
QGraphicsTextItem.__init__(self)
self.content = text
self.setPlainText(text)
self.setPos(pos)
self.setTextInteractionFlags(Qt.TextEditorInteraction)
self.setDefaultTextColor(Qt.black)
self.setFlags(
self.flags() | QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsSelectable)
self.setZValue(-1)
self.setAcceptDrops(True)
def boundingRect(self):
# get the original width and height of boundingrect
br = QGraphicsTextItem.boundingRect(self)
brw = br.width()
brh = br.height()
# new width and height in "blocks"
wblocks = int(brw / Settings.WIDTH) + 1
hblocks = int(brh / Settings.HEIGHT) + 1
w = wblocks * Settings.WIDTH
h = hblocks * Settings.HEIGHT
return QtCore.QRectF(0, 0, w, h)
def setGridIntersection(self, pos):
# get the next grid intersection top left of items top-left corner
grid_x = int(pos.x() / Settings.WIDTH)
grid_y = int(pos.y() / Settings.HEIGHT)
self.setPos(grid_x * Settings.WIDTH, grid_y * Settings.HEIGHT)
def paint(self, painter, option, widget):
painter.save()
painter.setBrush(QBrush(Qt.white))
painter.drawRect(self.boundingRect())
painter.restore()
super().paint(painter, option, widget)
def keyPressEvent(self, event):
super().keyPressEvent(event)
self.content = self.toPlainText()
def focusInEvent(self, event):
self.scene().writing_comment = True
# self.setPlainText(self.content)
# print("Focusinevent")
def focusOutEvent(self, event):
self.scene().writing_comment = False
# self.setHtml(self.content)
# print("FocusOutevent")
def contextMenuEvent(self, scme):
super().contextMenuEvent(scme)
并在 QS 类中添加:
def mouseMoveEvent(self, event):
QtWidgets.QGraphicsScene.mouseMoveEvent(self, event)
for i in self.selectedItems():
if type(i) == CI:
i.setGridIntersection(i.pos())
关于python - 如何对齐 QGraphicsTextItem 的网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41824106/
我希望能够像在 jsFiddle 中那样将元素列表对齐到右侧的复选框。这是如何做到这一点的最佳实践?传统上我从来没有 float 过相互嵌套的元素,所以我想确定这是否是解决此问题的正确方法。 代码(h
指令.align n是什么意思在数组中做什么? 更具体地说,假设我有以下部分代码: array: .align 2 .space 800 它的重要性是什么,为什么不跳过它并使用
基本上我正在寻找一种强制特定相对对齐的方法 即我想保证其他一些值(value) m s.t m > n alignment_of(foo) % 2^m == 2^n IE: .align 2^m; .
在我的代码中,我必须考虑一个数组数组,其中内部数组具有固定维度。为了使用 STL 算法,将数据实际存储为数组的数组很有用,但我还需要将该数据传递给 C 库,该库采用扁平化的 C 样式数组。 如果能够以
横向上,我想显示两个位图,并在它们之间显示一个标签字段。 代码看起来很简单,但所有字段都添加在屏幕左侧。 HorizontalFieldManager hfm = new HorizontalFiel
我想绘制一个变量名称及其符号。因为某些变量的名称很长,所以我试图将换行符与轴标签混合使用。这会导致对齐中发生有趣的事情: par(mar=c(1,12,1,1)) plot( y=1:6, 1:6,
使用这个脚本 df <- data.frame(x = 1:5, y = 1:5, color = letters[1:5]) ggplot(df, aes(x, y, fill = color))
我有一个带有标量字段的结构,比如妈妈,我想在屏幕上对齐的列中显示结构的值,可能还有一些标题。这是一个最小的工作示例: mom.a = 1; mom.b = 2; mom.veryLongName =
在 iOS6 中,我使用自动布局。 我有 2 个以编程方式创建的 View v1 和 v2。 v2 作为 subview 添加到 v1 v1 的约束已通过编程方式创建(此处未显示)。 我希望 v1 和
概述 浏览时operator new, operator new[] - cppreference.com ,似乎我们有许多选项来分配具有特定对齐要求的对象数组。但是,没有指定如何使用它们,而且我似乎
Widget _createProfileContainer() { return new Container( height: 64.0, child: ne
我正在使用 Bootstrap 和语义 UI 的组合来设计和对齐我的网页。目前,我在将页面 api map 和博客文章在整个页面上对齐时遇到问题,而不是像图像所示 那样堆叠在一起。 这是我的底层代码,
所以我已经添加了标签和所有内容,但我仍然在格式化和对齐所有内容时遇到问题。计算按钮显然应该居中。我知道使用 gridbag 将框架分割成坐标系,当一列大于其他列时,它会调整其他列并将其抛弃(对吗?)。
我必须将程序上的按钮对齐到中间,我运行的当前代码但显示的按钮与程序一样大,我想要一个特定大小的中心按钮,这是我尝试过的 /** * Created by Timk9 on 11/04/2016.
我正在尝试将 VIM 作为我的 ruby/rails 编辑器。太胖了,我对它的功能印象深刻 并且我能够安装以下插件以提供更好的 IDE 体验 自动配对 Better-snipmate-snippe
在结构内对齐成员的最佳或常规方法是什么?添加虚拟数组是最佳解决方案吗? 我有一个 double 的结构和 double 的三倍是吗? struct particle{ double mass;
我正在尝试对齐我的输出,但由于某种原因我无法做到我多么想要它,这真的很令人沮丧。标题不会正确对齐。我不知道我是否正确使用了 setw()。 #include using std::cout; usi
我正在开发一个 android 应用程序,其相对布局如下所示。 这是应用程序在屏幕上的显示方式的 imgur 链接:http://imgur.com/c4rNJ .我希望“Text 1”出现在“a l
我不确定为什么我不能在下面的代码中调整按钮的位置。我有几行设置了边界,但我一定遗漏了一些东西。 public DayGUI() { mainFrame = new JF
我有一个 html 页面,我想在页面底部对齐一个 iframe,使 iframe 占据所有宽度,我无法在底部对齐 iframe。请找到底部的 iframe 标签页面。 The rest of th
我是一名优秀的程序员,十分优秀!