编辑:
标准的 QScintilla 软件不支持此功能。但是 Matic Kukovec 做了一些小技巧来让它正常工作。他的解决方案在下面的回答中进行了解释,也在这个网页上进行了解释:https ://qscintilla.com/insert-images/
我想在 QScintilla 编辑器中插入图像。不幸的是,这样的功能不会很快添加到官方的 Scintilla 项目中。查看 Scintilla-interest-group 上的这篇文章:
https://groups.google.com/forum/#!topic/scintilla-interest/Bwr4DY2Pv3Q
所以我必须自己实现它。我试了一下。请将以下代码复制粘贴到 python 文件中并运行它。只需确保您qscintilla_logo.png
在同一个文件夹中有一个大约 80 x 80 像素的图像:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.Qsci import *
# -----------------------------------
# | A sample of C-code, pasted into |
# | the QScintilla editor |
# -----------------------------------
myCodeSample = r"""#include <stdio.h>
/*
* I want an image
* right here =>
*/
int main()
{
char arr[5] = {'h', 'e', 'l', 'l', 'o'};
int i;
for(i = 0; i < 5; i++) {
printf(arr[i]);
}
return 0;
}""".replace("\n","\r\n")
# --------------------------------------------------
class CustomMainWindow(QMainWindow):
def __init__(self):
super(CustomMainWindow, self).__init__()
# ---------------------------
# | Window setup |
# ---------------------------
# 1. Define the geometry of the main window
# ------------------------------------------
self.setGeometry(300, 300, 800, 400)
self.setWindowTitle("QScintilla Test")
# 2. Create frame and layout
# ---------------------------
self.__frm = QFrame(self)
self.__frm.setStyleSheet("QWidget { background-color: #ffeaeaea }")
self.__lyt = QVBoxLayout()
self.__frm.setLayout(self.__lyt)
self.setCentralWidget(self.__frm)
self.__myFont = QFont("Consolas", 14, weight=QFont.Bold)
self.__myFont.setPointSize(14)
# 3. Place a button
# ------------------
self.__btn = QPushButton("Qsci")
self.__btn.setFixedWidth(50)
self.__btn.setFixedHeight(50)
self.__btn.clicked.connect(self.__btn_action)
self.__btn.setFont(self.__myFont)
self.__lyt.addWidget(self.__btn)
# ---------------------------
# | QScintilla editor setup |
# ---------------------------
# 1. Make instance of QSciScintilla class
# ----------------------------------------
self.__editor = QsciScintilla()
self.__editor.setText(myCodeSample)
self.__editor.setLexer(None)
self.__editor.setUtf8(True) # Set encoding to UTF-8
self.__editor.setFont(self.__myFont) # Can be overridden by lexer
# 2. Create an image
# -------------------
self.__myImg = QPixmap("qscintilla_logo.png")
self.__myImgLbl = QLabel(parent=self.__editor)
self.__myImgLbl.setStyleSheet("QLabel { background-color : white; }");
self.__myImgLbl.setPixmap(self.__myImg)
self.__myImgLbl.move(300,80)
# 3. Add editor to layout
# ------------------------
self.__lyt.addWidget(self.__editor)
self.show()
''''''
def __btn_action(self):
print("Hello World!")
''''''
''' End Class '''
if __name__ == '__main__':
app = QApplication(sys.argv)
QApplication.setStyle(QStyleFactory.create('Fusion'))
myGUI = CustomMainWindow()
sys.exit(app.exec_())
''''''
运行 Python 脚本时,您应该得到以下结果:
我实际上是在编辑器顶部添加一个 QLabel ,并给它一个绝对位置:
self.__myImgLbl = QLabel(parent=self.__editor)
self.__myImgLbl.move(300,80)
不幸的是,向下滚动时图像不会移动:
我想我知道为什么。让我解释。编辑器是类的一个对象QsciScintilla
,它是 的子类QsciScintillaBase
,它是 的子类QAbstractScrollArea
:
我相信成功的关键是将 QLabel 添加到内的小部件QAbstractScrollArea
,而不是滚动区域本身。我已经尝试了几件事来找到那个小部件,但没有成功。
如果它是 a QScrollArea
,那么该功能widget()
就足够了。但是这个功能在QAbstractScrollArea
.
编辑 1:
python 代码示例中的编辑器不执行任何语法突出显示,甚至没有行号。那是因为我只想关注实际问题 - 添加图像。代码示例基于:https ://qscintilla.com/an-editor-in-a-gui/
编辑 2:
请不要就在编辑器中插入图像是好主意还是坏主意发表意见。让我们坚持手头的技术问题。