2014-09-10 19 views
5

Tôi đang phát triển một công cụ IM, như một phần của nó, tôi phải phát triển một BubbleChatWidget mà tất cả các mục tin nhắn có một hình ảnh nền bubble-like.I nghĩ rằng tôi có thể đạt được mục tiêu của mình với QTextEidt, nhưng tôi không biết làm thế nào để cho 'QTextFrame' hoặc QTextBlock hình nền.Làm thế nào để cung cấp cho QTextFrame hoặc QTextBlock một hình ảnh nền trong QTextEdit?

Vì vậy, câu hỏi của tôi là làm thế nào để cung cấp cho QTextFrame hoặc QTextBlock một background-image trong QTextEdit? Nếu QTextEdit không thể đáp ứng nhu cầu của tôi, làm thế nào để đạt được mục tiêu của tôi với Qt techniques khác?

BubbleChatWidget Tôi muốn có thể chứa clickable văn bản hoặc hình ảnh.Và bạn không thể quên thực tế rằng BubbleChatWidget có thể chứa hàng nghìn mục.

Hình ảnh dưới đây hiển thị những gì tôi muốn.

picture description

Trả lời

2

Bạn cần phải sửa đổi mã nguồn của Qt cho điều này.

Tôi đã thực hiện điều này năm ngoái.

Bạn có thể đặt hình nền (hình ảnh bong bóng) cho khung.

Nếu bạn r sử dụng Qt 4.8.6, xác định vị trí qtextdocumentlayout.cpp, tại dòng 402:

Giá trị mặc định điền thực hiện fillBackground là

p->fillRect(rect, brush); 

Bạn có thể thay đổi để qDrawBorderPixmap thay vì để vẽ một nền bong bóng.

4

Qt Style Sheets phù hợp hoàn hảo để đạt được những gì bạn muốn.

Giải pháp là sử dụng border image. May mắn thay bạn có thể làm điều đó với các tờ kiểu và bạn có thể tạo kiểu QTextEdit s.

Về styling QTextBlock s hoặc QTextFrame s: Một QTextEdit là một tiện ích sẽ hiển thị một QTextDocument có thể chứa QTextBlock s và QTextFrame s. Khung và khối là các vùng chứa văn bản cung cấp cấu trúc cho văn bản trong tài liệu nhưng chúng không được hiển thị bởi các tiện ích riêng biệt. Vì lý do đó họ không thể được theo kiểu độc lập. Những gì tôi khuyên bạn nên sử dụng một số QTextEdit hoặc các tiện ích khác cho mỗi thư và quản lý đúng cách sự gia tăng hậu quả trong việc sử dụng bộ nhớ.

Tôi sẽ vạch trần cách tạo kiểu chỉnh sửa văn bản.

Trước tiên, chụp một hình ảnh rõ ràng về đường viền mong muốn của bạn. Với Photoshop chút tôi đã chuẩn bị hình ảnh của riêng tôi (không phải là sạch như mong muốn cho một ứng dụng sản xuất):

bkg.png

Cho phép đối tượng phong cách của lớp QTextEdit và lớp con của nó.

QTextEdit { 
    background-color: #eaedf2;    /* Same gray in your background center */ 
    border-image: url(":/images/bkg.png"); /* The border image     */ 
    border-top-width: 11px; 
    border-right-width: 4px; 
    border-bottom-width: 4px; 
    border-left-width: 11px; 
} 

Thiết style sheet trước đến container của các chỉnh sửa văn bản sẽ biến tất cả trong số họ vào

enter image description here

Something này khá giống với cái nhìn của bạn mong muốn. Tất nhiên bạn phải chuẩn bị một hình ảnh biên giới tốt và điều chỉnh tốt hơn kích thước biên giới nhưng tôi nghĩ rằng điều này có thể giúp đỡ.

Nếu bạn muốn các kiểu khác nhau cho thư đến và thư đi thì bạn sẽ phải phân biệt đúng và chọn chúng trong bảng định kiểu. Kiểm tra this để tham khảo.

+0

Cảm ơn câu trả lời chi tiết của bạn.Chúng tôi chỉ đang tìm cách tốt hơn sử dụng một tiện ích riêng cho từng mục tin nhắn trước khi chúng tôi sử dụng cách đơn giản nhưng không hiệu quả. – waterd

+0

Trong trường hợp đó và nếu bạn muốn giữ mọi thứ đúng và dễ dàng, tại sao không sử dụng 'QListView', cung cấp thông báo trong mô hình tùy chỉnh và triển khai đại biểu của riêng bạn trình bày dữ liệu theo cách bạn muốn. Lượt xem có trách nhiệm tạo và phát hành các đại biểu khi cần. – mhcuervo

+0

Một cách tiếp cận cấp thấp hơn bạn có thể làm theo là thực hiện widget của riêng bạn hoặc 'QTextEdit' và hiển thị nội dung trong' paintEvent() 'của nó. (Điều đó có thể được thực hiện theo phong cách nhận thức nếu bạn muốn) 'Mã QBalloonTip' có thể được giúp đỡ. – mhcuervo

1

Bạn có thể sử dụng QBalloonTip đó là một lớp học nội quy định tại

QtDir/5.*/Src/qtbase/src/widgets/util/qsystemtrayicon_p.h 

QBalloonTip thừa hưởng QWidget và nó được thực hiện trong qsystemtrayicon.cpp tại cùng thư mục. Nó có phương pháp sau để hiển thị mẹo bóng:

void QBalloonTip::balloon(const QPoint& pos, int msecs, bool showArrow) 

Bạn có thể sửa đổi mã nguồn của lớp này để có đầu bóng mong muốn.

+0

Thanks.I sẽ thử nó. – waterd

1

Nếu bạn quan tâm đến dự án mã nguồn mở mà thực hiện điều tương tự (tôi gọi nó là 'Bubble trò chuyện'), bạn có thể tìm kiếm Telegram DesktopCutegram trong Github.

Họ là cả khách hàng của Telegram hoặc biến thể của nó thực hiện bởi Qt/QML.

Tôi nghĩ Cutegram là tốt hơn.

Hy vọng mẹo này sẽ giúp bạn.

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