2015-01-31 14 views
19

Tôi đang tạo trình chỉnh sửa mã tùy chỉnh với QPlainTextEditQSyntaxHighlighter và tôi đã gặp sự cố. Tôi muốn giữ nguyên cú pháp tô sáng ngay cả trong vùng chọn. Tuy nhiên, màu sắc của vùng chọn (màu môi trường) ghi đè màu của văn bản được đánh dấu bởi QSyntaxHighlighter và thẻ html. Các thuộc tính khác như họ phông chữ được giữ nguyên.QSyntaxHighlighter - lựa chọn văn bản ghi đè kiểu


Ví dụ:

Không lựa chọn:                       Selection:
Unselected         Selected
                                                                      (Tôi muốn Hello là màu xanh lá cây và World! để có màu đen)


Tôi cũng đã cố gắng để thiết lập các style sheet để:

QPlainTextEdit { 
    selection-color: rgba(0, 0, 0, 0); 
    selection-background-color: lightblue; 
} 

Kết quả:

enter image description here
Màu nền phủ lên văn bản và tốt, màu văn bản với alpha = 0 không hiển thị. Tôi đã làm điều đó chỉ để loại trừ ý tưởng rằng màu cú pháp vẫn còn dưới selection-color. Trên thực tế, nó được phủ lên bởi selection-background-color. Chỉnh sửa: Không, nếu tôi cũng đặt selection-background-color thành rgba(0, 0, 0, 0), không có lựa chọn nào và không có văn bản trong lựa chọn đó. Tất cả những gì tôi thấy là nền tảng.


Cách tiếp cận của đoạn sau đây mà làm cho toàn bộ dây chuyền con trỏ của nhấn mạnh dường như con đường để đi, nhưng tôi về cơ bản sẽ kết thúc reimplementing tất cả các cơ chế lựa chọn ...

QList<QTextEdit::ExtraSelection> extraSelections; 
QTextCursor cursor = textCursor(); 

QTextEdit::ExtraSelection selection; 
selection.format.setBackground(lineHighlightColor_); 
selection.format.setProperty(QTextFormat::FullWidthSelection, true); 
selection.cursor = cursor; 
selection.cursor.clearSelection(); 
extraSelections.append(selection); 
setExtraSelections(extraSelections); 

Có bất kỳ đơn giản giải pháp này?

+0

đã bao giờ bạn tìm một giải pháp đơn giản hơn? –

+1

@NicolasHolthaus Tôi đã từ chức. Nếu tôi đã tìm thấy một cách tiếp cận đơn giản hơn (tôi không biết nếu 'QTextEdit :: ExtraSelection' là một giải pháp khả thi), tôi đã chia sẻ nó. – LogicStuff

+3

đây là một giới hạn thực sự gây phiền nhiễu của trình đánh dấu cú pháp. –

Trả lời

2

vấn đề cư trú ở đây:

https://github.com/qt/qtbase/blob/e03b64c5b1eeebfbbb94d67eb9a9c1d35eaba0bb/src/widgets/widgets/qplaintextedit.cpp#L1939-L1945

QPlainTextEdit bảng sử dụng bối cảnh thay vì định dạng lựa chọn hiện tại.

Bạn có thể tạo một inheritings lớp từ QPlainTextEdit và ghi đè paintEvent

chữ ký:

void paintEvent(QPaintEvent *); 

Sao chép cơ quan chức năng từ github bên trong mới chức năng lớp paintEvent:

https://github.com/qt/qtbase/blob/e03b64c5b1eeebfbbb94d67eb9a9c1d35eaba0bb/src/widgets/widgets/qplaintextedit.cpp#L1883-L2013

thêm hàm này vào tệp cpp của bạn trước paintEvent (PlainTextEdit paintEvent cần nó):

https://github.com/qt/qtbase/blob/e03b64c5b1eeebfbbb94d67eb9a9c1d35eaba0bb/src/widgets/widgets/qplaintextedit.cpp#L1861-L1876

thêm

#include <QPainter> 
#include <QTextBlock> 
#include <QScrollBar> 

và thay thế từng xảy ra

o.format = range.format; 

whith

o.format = range.cursor.blockCharFormat(); 
o.format.setBackground(QColor(your selection color with alpha)); 

với điều đó tùy chỉnh của bạn PlainTextEdit kiểm tra thứ định dạng e liên kết với char hiện tại thay vì bảng PlainTextEdit bạn

(hãy cẩn thận (giấy phép L) GPL, tôi chỉ đưa ra một cách giải quyết opensource)

Các vấn đề liên quan