Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TextEdit
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
Antrix
Проблемма в следующем:
1. Есть TextEdit_1
2. Есть TextEdit_2

Нужно добавить текст из TextEdit_2 в TextEdit_1.
У TextEdit'та есть метод
QTextDocument * document () const - получить указатель на документ, но возникает вопрос, а как же теперь добавить полученный QTextDocument к другому TextEdit'ту?
Метод
void setDocument ( QTextDocument * document ) - не подходит, ибо устанавливает документ, а мне нужно к уже существующему добавить новый.
Возможно мне надо каким-то образом QTextDocument рабивать на QString и добавлять построчно
void append ( const QString & text ) - ?
Подскажите пожалуйста.
Litkevich Yuriy
если тебе все скопом надо перенести, то самы простой путь:
TextEdit_1.selectAll();
TextEdit_1.copy();
TextEdit_2.paste();

если части, то нужно пользоватся либо курсором, либо базовыми еденицами текста
Antrix
Еще один вопрос: почему когда я создаю функцию void f(QTextDocument); - то компилятор не выдаёт ошибок, а если я создаю слот
public slots: void slot(QTextDocument); - то выдает вот такую ошибку:

------ Build started: Project: chat, Configuration: Debug Win32 ------
MOC NickDialog.h
MOC MainWindow.h
MOC InputDialog.h
MOC DataBase.h
MOC AServer.h
MOC AClient.h
UIC NickForm.ui
UIC Form.ui
UIC DialogForm.ui
Compiling...
moc_NickDialog.cpp
moc_MainWindow.cpp
.\tmp\moc\debug_shared\moc_MainWindow.cpp(92) : error C2248: 'QTextDocument::QTextDocument' : cannot access private member declared in class 'QTextDocument'
        c:\qt\4.4.1\include\qtgui\../../src/gui/text/qtextdocument.h(276) : see declaration of 'QTextDocument::QTextDocument'
        c:\qt\4.4.1\include\qtgui\../../src/gui/text/qtextdocument.h(106) : see declaration of 'QTextDocument'
moc_InputDialog.cpp
moc_DataBase.cpp
moc_AServer.cpp
moc_AClient.cpp
main.cpp
NickDialog.cpp
MainWindow.cpp
.\MainWindow.cpp(161) : warning C4100: 'outputText' : unreferenced formal parameter
InputDialog.cpp
DataBase.cpp
AServer.cpp
AClient.cpp
Generating Code...
Build log was saved at "file://c:\QT\4.4.1\bin\chat\tmp\obj\debug_shared\BuildLog.htm"
chat - 1 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Компилятор - visual studio 2005 + qt
molchanoviv
потому-что slot это ключевое слово для moc
Antrix
Нет дело не в том, вот я переименовал слот:
public slots:
void test(QTextDocument);
Ошибка таже.
Antrix
А если писать
void test(QTextDocument*); вместо void test(QTextDocument);- то ошибка уже не возникает. Так в чем же дело это баг, или я что то не правильно делаю?
Litkevich Yuriy
Antrix, я вообще не понял о чем ты. можешь привести объявление класса и реализацию слота?
Antrix
Вот объявление класса
#ifndef _MainWindow_h_
#define _MainWindow_h_

#include <QMainWindow>
#include "ui_Form.h"
#include "AServer.h"
#include "AClient.h"
#include <QTextDocument>

class MainWindow : public QMainWindow, public Ui::MainWindow
{
    Q_OBJECT
public:
    MainWindow(QMainWindow* parent = 0);

private:
    AServer* server;
    AClient* client;
    bool serverEnableFlag;//флаг работе сервера
    bool clientEnableFlag;//флаг работы клиента
    bool cilentDisconnectedFlag;//флаг отсоединения клиента
    QString nickName;//ник
    QString nickNameOutput;//отформатированый ник
    QString setNick(QString nick);//форматирование ника

signals:
    //сигнал посылки текста
    void sendText(const QTextDocument&);
    void sendText(const QString&);
    //сигнал посылки ника
    void sendNick(QString);

public slots:
    //слот установки режима сервера
    void slotSetServerMode();
    //слот установки режима клиента
    void slotSetClientMode();
    //слот посылки текста
    void slotSendText();
    //слот смены ника
    void slotChangeNick();
    //слот ошибки сокета клиента
    void slotClientError();

    //слот вывода текста
    void slotTextOutput(QString);
    void slotTextOutput(QTextDocument*);

    void test(QTextDocument a);
    
};

#endif

Реализация
#include <QMessageBox>
#include "MainWindow.h"
#include "AServer.h"
#include "AClient.h"
#include "InputDialog.h"
#include "NickDialog.h"
#include "ui_Form.h"
#include <QTextDocument>
#include <QtSql>
#include <QSqlDatabase>
#include "DataBase.h"

const int Port = 5555;

MainWindow::MainWindow(QMainWindow *parent) : QMainWindow(parent)
{    
    . . .
}




void MainWindow::test(QTextDocument a)
{

}



Ошибка:

------ Build started: Project: chat, Configuration: Debug Win32 ------
MOC MainWindow.h
Compiling...
moc_MainWindow.cpp
.\tmp\moc\debug_shared\moc_MainWindow.cpp(95) : error C2248: 'QTextDocument::QTextDocument' : cannot access private member declared in class 'QTextDocument'
        c:\qt\4.4.1\include\qtgui\../../src/gui/text/qtextdocument.h(276) : see declaration of 'QTextDocument::QTextDocument'
        c:\qt\4.4.1\include\qtgui\../../src/gui/text/qtextdocument.h(106) : see declaration of 'QTextDocument'
main.cpp
MainWindow.cpp
AServer.cpp
Generating Code...
c:\qt\4.4.1\bin\chat\mainwindow.cpp(164) : warning C4700: uninitialized local variable 'documentBuffer' used
Build log was saved at "file://c:\QT\4.4.1\bin\chat\tmp\obj\debug_shared\BuildLog.htm"
chat - 1 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Litkevich Yuriy
Antrix, выкладывай moc_MainWindow.cpp
Antrix
Вот:

Раскрывающийся текст
/****************************************************************************
** Meta object code from reading C++ file 'MainWindow.h'
**
** Created: Sun 16. Nov 11:56:19 2008
** by: The Qt Meta Object Compiler version 59 (Qt 4.4.1)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/

#include "../../../MainWindow.h"
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'MainWindow.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 59
#error "This file was generated using the moc from 4.4.1. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif

QT_BEGIN_MOC_NAMESPACE
static const uint qt_meta_data_MainWindow[] = {

// content:
1, // revision
0, // classname
0, 0, // classinfo
11, 10, // methods
0, 0, // properties
0, 0, // enums/sets

// signals: signature, parameters, type, tag, flags
12, 11, 11, 11, 0x05,
36, 11, 11, 11, 0x05,
54, 11, 11, 11, 0x05,

// slots: signature, parameters, type, tag, flags
72, 11, 11, 11, 0x0a,
92, 11, 11, 11, 0x0a,
112, 11, 11, 11, 0x0a,
127, 11, 11, 11, 0x0a,
144, 11, 11, 11, 0x0a,
162, 11, 11, 11, 0x0a,
186, 11, 11, 11, 0x0a,
219, 217, 11, 11, 0x0a,

0 // eod
};

static const char qt_meta_stringdata_MainWindow[] = {
"MainWindow\0\0sendText(QTextDocument)\0"
"sendText(QString)\0sendNick(QString)\0"
"slotSetServerMode()\0slotSetClientMode()\0"
"slotSendText()\0slotChangeNick()\0"
"slotClientError()\0slotTextOutput(QString)\0"
"slotTextOutput(QTextDocument*)\0a\0"
"test(QTextDocument)\0"
};

const QMetaObject MainWindow::staticMetaObject = {
{ &QMainWindow::staticMetaObject, qt_meta_stringdata_MainWindow,
qt_meta_data_MainWindow, 0 }
};

const QMetaObject *MainWindow::metaObject() const
{
return &staticMetaObject;
}

void *MainWindow::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_MainWindow))
return static_cast<void*>(const_cast< MainWindow*>(this));
if (!strcmp(_clname, "Ui::MainWindow"))
return static_cast< Ui::MainWindow*>(const_cast< MainWindow*>(this));
return QMainWindow::qt_metacast(_clname);
}

int MainWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QMainWindow::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
case 0: sendText((*reinterpret_cast< const QTextDocument(*)>(_a[1]))); break;
case 1: sendText((*reinterpret_cast< const QString(*)>(_a[1]))); break;
case 2: sendNick((*reinterpret_cast< QString(*)>(_a[1]))); break;
case 3: slotSetServerMode(); break;
case 4: slotSetClientMode(); break;
case 5: slotSendText(); break;
case 6: slotChangeNick(); break;
case 7: slotClientError(); break;
case 8: slotTextOutput((*reinterpret_cast< QString(*)>(_a[1]))); break;
case 9: slotTextOutput((*reinterpret_cast< QTextDocument*(*)>(_a[1]))); break;
case 10: test((*reinterpret_cast< QTextDocument(*)>(_a[1]))); break;
}
_id -= 11;
}
return _id;
}

// SIGNAL 0
void MainWindow::sendText(const QTextDocument & _t1)
{
void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
QMetaObject::activate(this, &staticMetaObject, 0, _a);
}

// SIGNAL 1
void MainWindow::sendText(const QString & _t1)
{
void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
QMetaObject::activate(this, &staticMetaObject, 1, _a);
}

// SIGNAL 2
void MainWindow::sendNick(QString _t1)
{
void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
QMetaObject::activate(this, &staticMetaObject, 2, _a);
}
QT_END_MOC_NAMESPACE
Litkevich Yuriy
Antrix, я что-то сразу не сообразил в Асистент посмотреть, теперь смотрю и вижу:

QTextDocument ( QObject * parent = 0 ) 
QTextDocument ( const QString & text, QObject * parent = 0 )
~QTextDocument ()
т.е. конструктор копирования не доступен.
Если функция объявленна так:
void test(QTextDocument a);

и соответственно ты ее вызываешь так:
QTextDocument   td;
...
test(td);
компилятор должен будет вызвать конструктор копирования, которого нет, вот он и ругается.
Antrix
Ну а почему тогда, если создаю точно такую же функцию а не слот, компилятор не ругается?

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

#include <QMainWindow>
#include "ui_Form.h"
#include "AServer.h"
#include "AClient.h"
#include <QTextDocument>

class MainWindow : public QMainWindow, public Ui::MainWindow
{
    Q_OBJECT
public:
    MainWindow(QMainWindow* parent = 0);


    void test(QTextDocument a);

private:
    AServer* server;
    AClient* client;
    bool serverEnableFlag;//флаг работе сервера
    bool clientEnableFlag;//флаг работы клиента
    bool cilentDisconnectedFlag;//флаг отсоединения клиента
    QString nickName;//ник
    QString nickNameOutput;//отформатированый ник
    QString setNick(QString nick);//форматирование ника

signals:
    //сигнал посылки текста
    void sendText(const QTextDocument&);
    void sendText(const QString&);
    //сигнал посылки ника
    void sendNick(QString);

public slots:
    //слот установки режима сервера
    void slotSetServerMode();
    //слот установки режима клиента
    void slotSetClientMode();
    //слот посылки текста
    void slotSendText();
    //слот смены ника
    void slotChangeNick();
    //слот ошибки сокета клиента
    void slotClientError();

    //слот вывода текста
    void slotTextOutput(QString);
    void slotTextOutput(QTextDocument*);
    
};

#endif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.