crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Не выделяется текст мышью в QTextEdit, Свой класс унаследован от QTextEdit
QMainWindow
  опции профиля:
сообщение 5.8.2011, 14:31
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Привет всем!
Появился непонятный глюк с QTextEdit. В общем создал свой класс, который наследует только QTextEdit. В классе пока (теперь) ничего нет. Создаю объект в главном окне (на центральном виджете). Устанавливаю геометрию сего виджета и все. Запускаю, все нормально отображается. Далее ввожу текст в мое поле, пытаюсь выделить посимвольно, но ничего не получается. Удается выделить только либо все слово целиком, либо всю строку (или параграф). Т.е. отдельные буквы в слове мышью не получается выделить (когда мышью пытаюсь выделить, даже синей подсветки выделения НЕТ!).
Думал какие глюки, для проверки создал непосредственно объект QTextEdit - но там все как и должно быть. Что за бред?

Сообщение отредактировал QMainWindow - 5.8.2011, 14:32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 5.8.2011, 14:37
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


class MyTextEdit : public QTextEdit
{
};


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    setupUi(this);

    MyTextEdit *my = new MyTextEdit();
    my->setParent( this );
    my->setGeometry(100,100,50,40);

}


Все работает как надо :huh:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QMainWindow
  опции профиля:
сообщение 5.8.2011, 15:06
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Класс:
Раскрывающийся текст
#ifndef TEXTEDIT_H
#define TEXTEDIT_H

#include <QTextEdit>
#include <QMouseEvent>
#include "FindDialog.h"

class TextEdit : public QTextEdit
{
    Q_OBJECT
public:
    TextEdit(QWidget *parent = 0);
private:
    QWidget *mw;
    bool hidden;
signals:
    void hideMenu();
    void showMenu();
protected:
    virtual void mouseMoveEvent(QMouseEvent *e);
public slots:
    void Find(bool wholeWords, bool caseSensitive, int direction, QString &text);
    void toBeginning();
    void toEnd();
};

#endif // TEXTEDIT_H


Раскрывающийся текст
#include "TextEdit.h"
#include <QDebug>

TextEdit::TextEdit(QWidget *parent) : QTextEdit(parent)
{
    //this->setMouseTracking(true);
   // mw = parent;
   // hidden = true;
}

void TextEdit::mouseMoveEvent(QMouseEvent *e)
{
//    if(mw->windowState() == Qt::WindowFullScreen)
//    {
//        if(!e->y()) emit showMenu();
//        else emit hideMenu();
//    }
}

void TextEdit::Find(bool wholeWords, bool caseSensitive, int direction, QString &text)
{
//    QTextDocument::FindFlags flag1, flag2, flag3;
//    if(wholeWords) flag1 = QTextDocument::FindWholeWords;
//    if(caseSensitive) flag2 = QTextDocument::FindCaseSensitively;
//    if(direction == FindDialog::Up) flag3 = QTextDocument::FindBackward;
//    this->find(text, flag1 | flag2 | flag3);
}

void TextEdit::toBeginning()
{
  //  this->moveCursor(QTextCursor::End);
}

void TextEdit::toEnd()
{
  //  this->moveCursor(QTextCursor::Start);
}


MainWindow:
Раскрывающийся текст
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextDocument>
#include <QTextCursor>
#include "TextEdit.h"
#include "Parser.h"
#include "FileInfoDialog.h"
#include "BookInfoDialog.h"

namespace Ui
{
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    enum Dialogs
    {
    bookInfoDialog, fileInfoDialog
    };
    TextEdit *textEdit;
private:
    Ui::MainWindow *ui;
    Parser *parser;
    int MBH, SBH, MPH;
    bool hidden;
   // TextViewer *viewer;
//   QTextDocument *doc;
  //  QFont titleFont, textFont, subtitleFont;
  //  QString t, fontSize;
  //  QBrush nh;
protected:
    virtual void resizeEvent(QResizeEvent *e);
    virtual void mouseMoveEvent(QMouseEvent *e);
private slots:
    void Open();
    void Quit();
    void FileInfo();
    void BookInfo();
    void fullScreenMode();
    void normalScreenMode();
    void Find();
    void AddBookmark();
    inline void zoomIn() {textEdit->zoomIn();}
    inline void zoomOut() {textEdit->zoomOut();}
    void hideMenu();
    void showMenu();
signals:
    void dialogOpened(int dialogType);
    void selectedText(QString &text, int pos);
};

#endif // MAINWINDOW_H

Раскрывающийся текст
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "FindDialog.h"
#include "AddBookmarkDialog.h"
#include <QFile>
#include <QMessageBox>
#include <QFileDialog>
#include <QMouseEvent>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
//    ui->statusBar->resize(this->width(),20);
    SBH = ui->statusBar->height();
    MPH = ui->menuBar->height()+ui->mainToolBar->height();
    MBH = ui->menuBar->height();
    textEdit = new TextEdit(this);
//    parser = new Parser(textEdit);
    textEdit->setGeometry(0,MPH,this->width(),this->height()-MPH-SBH);
//    textEdit->setFrameShape(QFrame::NoFrame);
//    textEdit->setReadOnly(true);
//    connect(ui->OpenAct, SIGNAL(triggered()), this, SLOT(Open()));
//    connect(ui->QuitAct, SIGNAL(triggered()), this, SLOT(Quit()));
//    connect(ui->FileInfoAct, SIGNAL(triggered()), this, SLOT(FileInfo()));
//    connect(ui->BoobInfoAct, SIGNAL(triggered()), this, SLOT(BookInfo()));
//    connect(ui->ZoomInAct, SIGNAL(triggered()), this, SLOT(zoomIn()));
//    connect(ui->ZoomOutAct, SIGNAL(triggered()), this, SLOT(zoomOut()));
//    connect(ui->FullScreenModeAct, SIGNAL(triggered()), this, SLOT(fullScreenMode()));
//    connect(ui->NormalScreenModeAct, SIGNAL(triggered()), this, SLOT(normalScreenMode()));
//    connect(ui->FindAct, SIGNAL(triggered()), this, SLOT(Find()));
//    connect(ui->FirstPageAct, SIGNAL(triggered()), textEdit, SLOT(toBeginning()));
//    connect(ui->LastPageAct, SIGNAL(triggered()), textEdit, SLOT(toEnd()));
//    connect(ui->AddBookmarkAct, SIGNAL(triggered()), this, SLOT(AddBookmark()));
//    connect(this, SIGNAL(dialogOpened(int)), parser, SLOT(getDialog(int)));
//    connect(textEdit, SIGNAL(hideMenu()), this, SLOT(hideMenu()));
//    connect(textEdit, SIGNAL(showMenu()), this, SLOT(showMenu()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::Open()
{
//    QString fileName = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("Открыть книгу"), QDir::currentPath(), QString::fromLocal8Bit("Файлы FB2 *.fb2"));
//    if (fileName.isEmpty()) return;

//    QFile file(fileName);
//    if (!file.open(QFile::ReadOnly | QFile::Text))
//    {
//    QMessageBox::warning(this, tr("fb2Reader"), QString::fromLocal8Bit("Невозможно прочесть файл %1:\n%2.").arg(fileName).arg(file.errorString()));
//    return;
//    }
//    parser->Parse(&file);
}

void MainWindow::Quit()
{
//    this->close();
}

void MainWindow::resizeEvent(QResizeEvent *e)
{
   // textEdit->resize(this->width(), this->height()-ui->menuBar->height()-ui->mainToolBar->height()-SBH);
}

void MainWindow::FileInfo()
{
//    emit dialogOpened(fileInfoDialog);
}

void MainWindow::BookInfo()
{
//    emit dialogOpened(bookInfoDialog);
}

void MainWindow::fullScreenMode()
{
//    hidden = true;
//  //  ui->menuBar->move(0,-ui->menuBar->height());
//  //  ui->mainToolBar->move(0, -ui->menuBar->height()-ui->mainToolBar->height());
//    ui->NormalScreenModeAct->setEnabled(true);
//    ui->FullScreenModeAct->setEnabled(false);
//    ui->FullScreenModeAct->setVisible(false);
//    ui->NormalScreenModeAct->setVisible(true);
//    this->showFullScreen();
//    textEdit->move(0,0);
//    textEdit->resize(this->width(),this->height()-SBH);
//    textEdit->setMouseTracking(true);
}

void MainWindow::normalScreenMode()
{
//    hidden = false;
//    ui->NormalScreenModeAct->setEnabled(false);
//    ui->FullScreenModeAct->setEnabled(true);
//    ui->FullScreenModeAct->setVisible(true);
//    ui->NormalScreenModeAct->setVisible(false);
// //   ui->menuBar->move(0,0);
// //   ui->mainToolBar->move(0,ui->menuBar->height());
//    textEdit->move(0,ui->menuBar->height()+ui->mainToolBar->height());
//    this->showNormal();
//    textEdit->setMouseTracking(false);
//    textEdit->raise();
}

void MainWindow::Find()
{
//    FindDialog *dialog = new FindDialog(this);
//    connect(dialog, SIGNAL(searchParameters(bool,bool,int,QString&)), textEdit, SLOT(Find(bool,bool,int,QString&)));
//    dialog->show();
}

void MainWindow::hideMenu()
{
//    if(/*ui->menuBar->pos().y() != -MBH*/!hidden)
//    {
//    //ui->menuBar->move(0,-ui->menuBar->height());
//    //ui->mainToolBar->move(0,-ui->menuBar->height()-ui->mainToolBar->height());
//    hidden = true;
//    ui->menuBar->lower();
//    ui->mainToolBar->lower();
//    }
}

void MainWindow::showMenu()
{
//    if(/*ui->menuBar->pos().y() != 0*/hidden)
//    {
//    //ui->menuBar->move(0,0);
//    //ui->mainToolBar->move(0,ui->menuBar->height());
//    ui->menuBar->raise();
//    ui->mainToolBar->raise();
//    hidden = false;
//    }
}

void MainWindow::mouseMoveEvent(QMouseEvent *e)
{

}

void MainWindow::AddBookmark()
{
//    AddBookmarkDialog *dialog = new AddBookmarkDialog(this,textEdit);
//       // connect(this, SIGNAL(selectedText(QString&,int)), dialog, SLOT(selectedText(QString&,int)));
//       // emit selectedText(textEdit->textCursor().selectedText(), textEdit->textCursor().anchor());
//    dialog->show();
}

Что не так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 5.8.2011, 15:12
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Цитата
void TextEdit::mouseMoveEvent(QMouseEvent *e)
{
// if(mw->windowState() == Qt::WindowFullScreen)
// {
// if(!e->y()) emit showMenu();
// else emit hideMenu();
// }
}


у тебя mouseMoveEvent перекрывается производным классом и до QTextEdit не доходит вообще. В этом и кроется беда.

Решение:

Цитата
void TextEdit::mouseMoveEvent(QMouseEvent *e)
{
QTextEdit::mouseMoveEvent(e);
// if(mw->windowState() == Qt::WindowFullScreen)
// {
// if(!e->y()) emit showMenu();
// else emit hideMenu();
// }
}

или

Цитата
void TextEdit::mouseMoveEvent(QMouseEvent *e)
{
// if(mw->windowState() == Qt::WindowFullScreen)
// {
// if(!e->y()) emit showMenu();
// else emit hideMenu();
// }
QTextEdit::mouseMoveEvent(e);
}


Выбирай сам :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QMainWindow
  опции профиля:
сообщение 5.8.2011, 15:22
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Гениально!
Вот уж не подумал бы, что тут надо аргумент специально передавать...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 16:58