Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: agentcoba от Ноябрь 23, 2009, 02:41



Название: Виджет внутри другого
Отправлено: agentcoba от Ноябрь 23, 2009, 02:41
У меня есть объект QLabel,  в нём есть гиперссылка... при нажатии она испускает сигнал void QLabel::linkActivated ( const QString & link ).. всё работает.. сигнал испускается..

Но мне нужно поместить этот QLabel внутрь QScrollArea..

То-есть пишу к примеру ui.scrollArea->setWidget( ui.label );  всё работает, скролинг появляется, но ссылка перестаёт испускать сигнал... все свойства что смог перепробовал настроить :( ... помогите пожалуйста...


Название: Re: Виджет внутри другого
Отправлено: lit-uriy от Ноябрь 23, 2009, 09:54
Это может происходить, если QScrollArea для каких-то целей отслеживает мышку (щелчки)


Название: Re: Виджет внутри другого
Отправлено: mell от Ноябрь 23, 2009, 10:56
возможно придется создать наследника QLabel и самому перехватывать эвенты, как в этом примере с QGraphicsView: http://www.prog.org.ru/index.php?topic=10828.msg66839#msg66839 (http://www.prog.org.ru/index.php?topic=10828.msg66839#msg66839)


Название: Re: Виджет внутри другого
Отправлено: agentcoba от Ноябрь 23, 2009, 16:48
возможно придется создать наследника QLabel и самому перехватывать эвенты, как в этом примере с QGraphicsView: http://www.prog.org.ru/index.php?topic=10828.msg66839#msg66839 (http://www.prog.org.ru/index.php?topic=10828.msg66839#msg66839)
У меня не получилось...//  Компилится, но эффекта нету... (логику событий я не очень понимаю).

Я пытался использовать функцию void QWidget::grabMouse ().     После вызова ui.scrollArea->setWidget( ui.label ); пишу ui.label->grabMouse()
Из асистента:
>>Warning: Bugs in mouse-grabbing applications very often lock the terminal. Use this function with extreme caution, and consider using the -nograb command line option while debugging.  It is almost never necessary to grab the mouse when using Qt, as Qt grabs and releases it sensibly. In particular, Qt grabs the mouse when a mouse button is pressed and keeps it until the last button is released.

Короче баг действительно появляется...  при запуске всё капитально виснет,ctrl+alt+del жму - пишет критическую ошибку, жму пропустить... и тут... ВСЁ работает! сигнал испускается, но только почему-то два раза...

но так дело не пойдёт... думаю дальше :(


Название: Re: Виджет внутри другого
Отправлено: mell от Ноябрь 23, 2009, 18:58
в данном коде сигнал испускается:
Код:
#include <QtGui> // qt 4.5

class MainWindow: public QMainWindow {
Q_OBJECT
public:
MainWindow() {
QLabel *label = new QLabel("<a href='localhost'>link</a><br><br><br><br><br><br><br><br><br><br><br><br>!!!!!");
QScrollArea *scroll = new QScrollArea;
scroll->setWidget(label);

connect(label, SIGNAL(linkActivated(QString)), SLOT(linkSlot(QString)));

this->setCentralWidget(scroll);
}

private slots:
void linkSlot(QString s) {
qDebug() << s;
}
};

int main(int argc, char **argv)
{
QApplication app(argc, argv);
MainWindow Window;
Window.show();
return app.exec();
}

#include "main.moc"


Название: Re: Виджет внутри другого
Отправлено: agentcoba от Ноябрь 23, 2009, 21:17
в данном коде сигнал испускается:

испускается... но у меня ui.scroll объект, а не scroll...
this->setCentralWidget( ui.scroll  );    в этом случае выдаёт ошибку памяти.. ((

Вот конструктор главного например:
Код:
{
ui.setupUi(this);

QLabel *label = new QLabel("<a href='localhost'>link</a><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>!!!!!");

ui.scroll->setWidget(label);

connect(label, SIGNAL(linkActivated(QString)), SLOT( newCurrentItem(QString)) );

this->setCentralWidget( ui.scroll );    // Ошибка памяти
}


Название: Re: Виджет внутри другого
Отправлено: mell от Ноябрь 23, 2009, 22:11
создал проект, на форму добавил QScrollArea и QLabel, такой код, сигнал испускает

Код:
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
ui->scrollArea->setWidget( ui->label );
ui->label->setText("<a href='localhost'>link</a>!!<br><br>!!<br><br><br><br><br>!!!!!");

connect(ui->label, SIGNAL(linkActivated(QString)), SLOT(linkSlot(QString)));

}