LINUX.ORG.RU

[Qt] подскажите виджет


0

3

Нужен виджет, в котором будет отображаться текст. Но этот текст составлен из частей, которые за сценой являются отдельными объектами. При клике на любом месте в тексте мы можем определить на каком объекте произошел клик и, например, подсветить бэкграунд всего текста относящегося к этому объекту.

Какой из встроенных виджетов лучше подойдет для реализациии или может есть нечто готовое?

ну раз у вас сцена - то и выводите на сцену объекты «текста». сами можете пересчитать координаты блоков текста один относительно другого. при клике по тексту какого-то из объектов схватите сигнал, что выделен графический объект

какие ограничения-то есть? скорость? память? или чтобы текста по-минимуму было?

готового виджета с такими свойствами не подскажу

gunja ()
Ответ на: комментарий от gunja

Сцена это условно. С виду будет обычный текстовый редактор. Нужно нечто похожее на QTextEdit, его rich режим пожалуй тоже нужен. Но как в нем разделить текст на объекты пока не очень представляю.
Ограничений особых нет.

Olegymous ★★ ()
Ответ на: комментарий от fluorite

Куча QLabel'ов это конечно идея. Если у них убрать рамки может даже будет выглядеть нормально. Но мне кажется это не лучший вариант.

Olegymous ★★ ()

Использовать QGraphicsTextItem (или унаследованный от него класс) и выводить на сцену. Если я правильно понял твою задачу.

stolz ()

В идеале любой виджет позволяющий вывести Html с работающей явой. Туды подцепить jquery и вперед и с песней.

Назначаем класс на каждый блок, делаем для всех классов обработчик клика. Ну и дальше по накатаной.

Можно без jquery, просто самопальным жабаскриптом, но само по себе запихивание jquery довольно прикольная задача.

Вообще с QGraphicScene можно замутить, написать обертку реализующую текстогенерацию из готового списка объектов, плюс вызов соответствующих слотов.

iTroll ()
Ответ на: комментарий от iTroll

В идеале любой виджет позволяющий вывести Html с работающей явой. Туды подцепить jquery и вперед и с песней.

Нашел тут свой старый быдлокод, когда была идея couchdb прицепить. Довольно быстро отказался от этой идеи.
web.h

#ifndef WEB_H
#define WEB_H

#include <QtGui/QWidget>
#include <QtGui/QLabel>
#include <QtGui/QVBoxLayout>

#include <QtWebKit/QWebView>

class Web : public QWidget
{
    Q_OBJECT
public:
    Web(QWidget *parent = 0);
    ~Web();
private:
    QString ip_db;
    QString port_db;
    QString name_db;
    QWebView *view;
};
#endif // WEB_H
web.cpp
#include "web.h"
Web::Web(QWidget *parent)
    : QWidget(parent)
{
    ip_db = "127.0.0.1";
    port_db = "5984";
    name_db = "test";

    QString full_path_db = QString("http://%1:%2/%3/_design/pages/").arg(ip_db).arg(port_db).arg(name_db);

    QLabel *label = new QLabel;
    label->setText(QString("debug: " + full_path_db));

    view = new QWebView(this);
    view->load(QUrl("qrc:/html/index.html"));
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label);
    layout->addWidget(view);

    setLayout(layout);
}
index.html (о боже, о чем это вообще?)
<!DOCTYPE html> 
<html> 
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
  <body>
<h1>hello there</h1>
<script>
/*
   $.couch.allDbs({
      success : function(dbs) {
        dbs.forEach(function(db) {
          $("#databases").append('<li><a href="/_utils/database.html?'+db+'">'+db+'</a></li>');
        });
      }
    });
 
*/

/*create db
var dbName = "test8";
$.couch.db(dbName).create();

/* create document
var p = new Object();
p._id = "testData";
p.longName = "";
p.shortName = "";
p.Type = "";
$.couch.db(dbName).saveDoc(p, {"async":"false"});


/*
list all doc
$.couch.db(dbName).allDocs();


$.ajax({
	type:	'put',
	url:	'http://127.0.0.1:5984/test2/testData',
	data:	'{"longName":"", "shortName":"", "Type":"", "State":""}',
	async:	false,
	success: function(data) {
	},
	error: function (XMLHttpRequest, textStatus, errorThrown) {
		error(XMLHttpRequest.status + ' ' + XMLHttpRequest.responseText); }
});
*/
  </script> 
</body> 
</html>

fluorite ★★★★★ ()

Не уверен, после беглого прочтения доков, мне кажется, что можно применить такой подход: создаём QTextDocument, дальше создаём блоки текста (QTextBlock) при помощи QTextCursor::insertText() (возможно, QTextCursor::insertBlock()). Затем остаётся лишь использовать QTextBlock::setUserData для хранения ссылок на твои объекты, а для определения блока:

QTextBlock QTextDocument::findBlock(int pos) const

Returns the text block that contains the pos-th character.
unC0Rr ★★★★★ ()
Ответ на: комментарий от unC0Rr

Хотел так сделать, но новый QTextBlock всегда начинается с новой строки. А в одной строке может быть несколько разных объектов.

Решил всё-таки делать через QTextEdit + QTextDocument, а на объекты разделять на основе позиции в тексте (начало и конец), тем более, что текст редактироваться не будет.

Olegymous ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.