Vâng, bạn có thể sử dụng các đại biểu để làm rich text trong một qtableview với đại biểu tùy chỉnh reimplementing phương pháp sơn như:
void CHtmlDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QStyleOptionViewItemV4 opt(option);
QLabel *label = new QLabel;
label->setText(index.data().toString());
label->setTextFormat(Qt::RichText);
label->setGeometry(option.rect);
label->setStyleSheet("QLabel { background-color : transparent; }");
painter->translate(option.rect.topLeft());
label->render(painter);
painter->translate(-option.rect.topLeft());
}
Tuy nhiên, nó sẽ không làm cho siêu liên kết có thể nhấp được.
Để thực hiện việc này, bạn có thể sử dụng bản hack sau. Thực hiện lại phương thức setModel của khung nhìn bảng/danh sách của bạn và sử dụng setIndexWidget.
void MyView::setModel(QAbstractItemModel *m)
{
if (!m)
return;
QTableView::setModel(m);
const int rows = model()->rowCount();
for (int i = 0; i < rows; ++i)
{
QModelIndex idx = model()->index(i, 1);
QLabel *label = new QLabel;
label->setTextFormat(Qt::RichText);
label->setText(model()->data(idx, CTableModel::HtmlRole).toString());
label->setOpenExternalLinks(true);
setIndexWidget(idx, label);
}
}
Trong ví dụ trên, tôi thay thế cột 1 bằng qlabels. Lưu ý rằng bạn cần vô hiệu hóa vai trò hiển thị trong mô hình để tránh trùng lặp dữ liệu.
Dù sao, tôi sẽ quan tâm đến giải pháp tốt hơn dựa trên các đại biểu.
Kaleb , đây là cách duy nhất để vẽ các siêu liên kết trong một khung nhìn, và topicstarter muốn nhận ra, làm thế nào để tạo các liên kết có thể nhấp ở đó, mà không cần cắt một QTextBrowser vào mọi ô. –
Tôi rất quan tâm, làm thế nào tôi có thể làm điều đó, quá, nếu bạn biết cách, xin vui lòng, cho chúng tôi biết, làm thế nào. –
Sau đó, bạn cũng sẽ thực hiện lại QAbstractItemDelegate :: editorEvent() để nhận được các cú click chuột, và nếu bấm vào một liên kết, hãy dùng QDesktopServices :: openUrl() để mở URL. –