selectionChanged не вызывается, когда текст выделен в QWebView C#

У меня есть QWebView в моих окнах, который содержит текст. Я хочу, чтобы выделенное слово (или слова не важно) было записано где-то еще, но сигнал selectionChanged никогда не вызывается. Нужно ли что-то устанавливать раньше? На данный момент все, что у меня есть, это слот, ожидающий вызова ... Я даже ничего пока не делаю, потому что сигнал никогда не отправляется

Благодарность!

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    this->setupUi();
    connect(m_WebView, SIGNAL(selectionChanged()), this, SLOT(newSelection()));
}

MainWindow::~MainWindow()
{
}

void MainWindow::setupUi()
{
    m_WebView = new QWebView();
    m_LineEdit = new QLineEdit();

    QVBoxLayout* lay = new QVBoxLayout();

    lay->addWidget(m_LineEdit);
    lay->addWidget(m_WebView);

    QWidget* wid = new QWidget(this);
    wid->setLayout(lay);

    setCentralWidget(wid);
}

void MainWindow::newSelection()
{
    m_LineEdit->setText(m_WebView->selectedText());
}

person castors33    schedule 23.03.2012    source источник
comment
Я сделал небольшой проект, чтобы показать, что я хочу сделать... больше ничего не нужно!   -  person castors33    schedule 23.03.2012
comment
Если я не ошибаюсь в вашем примере, он очень похож на мой на питоне, и мой работает... не уверен...   -  person jdi    schedule 24.03.2012
comment
да, похоже... я не знаю python... но он не работает в моем проекте   -  person castors33    schedule 24.03.2012
comment
Ну, я думаю, дело в том, что я не устанавливаю никаких атрибутов в WebView или чего-то особенного, кроме прямого подключения сигнала к методу. Пробовали ли вы печатать, а не устанавливать значение в строке редактирования, чтобы убедиться, что оно попало в ваш метод newSelection()?   -  person jdi    schedule 24.03.2012
comment
Это была ошибка в Qt 4.6 (я думаю, поскольку Qt 4.7 была выпущена через 1 месяц после наложения пластыря). Или вы забыли использовать макрос Q_OBJECT в своем определении класса.   -  person alexisdm    schedule 24.03.2012


Ответы (2)


Я не уверен, почему пример, который вы привели, не сработал. Это работает (и это потому, что я подключаюсь к странице, а не к просмотру). На вашем месте я бы подумал о том, чтобы отправить отчет об ошибке разработчикам. Судя по документам, это ДОЛЖНО работать.

цена за тысячу показов:

    #include "mainwindow.h"
    #include <QWebView>
    #include <QLineEdit>
    #include <QVBoxLayout>
    #include <QTimer>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    this->setupUi();
    connect(m_WebView->page(), SIGNAL(selectionChanged()), this, SLOT(newSelection()));
}

MainWindow::~MainWindow()
{
}

void MainWindow::setupUi()
{
    m_WebView = new QWebView();
    m_WebView->load(QUrl("http://qt.nokia.com/"));
    m_WebView->show();
    m_LineEdit = new QLineEdit();

    QVBoxLayout* lay = new QVBoxLayout();

    lay->addWidget(m_LineEdit);
    lay->addWidget(m_WebView);


    QWidget* wid = new QWidget(this);
    wid->setLayout(lay);

    setCentralWidget(wid);
}

void MainWindow::newSelection()
{
    m_LineEdit->setText(m_WebView->selectedText());
}

h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class QWebView;
class QLineEdit;
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void setupUi();

  protected slots:
    void newSelection();
private:
    Ui::MainWindow *ui;
    QWebView * m_WebView;
    QLineEdit * m_LineEdit;
};

#endif // MAINWINDOW_H
person David D    schedule 23.03.2012
comment
Я не понимаю, почему... но ваш код работает... немного странно... но, по крайней мере, он работает! Благодарность! - person castors33; 30.03.2012

Я понятия не имею, как выглядит ваш код, но вот полностью рабочий пример PyQt:

from PyQt4 import QtCore, QtGui, QtWebKit

class Dialog(QtGui.QDialog):

    def __init__(self, parent=None):
        super(Dialog, self).__init__()
        self.resize(800,600)

        self.web = QtWebKit.QWebView()
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.web)

        self.web.setUrl(QtCore.QUrl("http://www.stackoverflow.com/"))
        self.web.selectionChanged.connect(self.selectionChanged)

    def selectionChanged(self):
        print self.web.selectedText()


if __name__ == "__main__":
    app = QtGui.QApplication([])
    dialog = Dialog()
    dialog.show()
    dialog.raise_()
    app.exec_()

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

person jdi    schedule 23.03.2012