• 10961阅读
  • 9回复

有关QTextEdit的两个问题 [复制链接]

上一主题 下一主题
离线levine
 
只看楼主 正序阅读 楼主  发表于: 2008-03-26
— 本帖被 XChinux 执行加亮操作(2008-03-29) —
想用QTextEdit做一个程序执行状态的显示窗口。
设置了readOnly属性。结果有两个问题:
1.在程序执行过程中去翻看前面的信息,如果不把光标(虽然光标看不见)定位到最后一行,就会从翻看的位置打印信息。有没有把光标定位到最后的API?
2.怎样实现右键清除全部文本?这儿不能设置成readOnly是吗?

不知道把问题表述清楚没有。谢谢大家!

离线levine
只看该作者 9楼 发表于: 2008-04-01
你上面程序里的lineEdit_2是不是就是文本编辑器的对象名?
还是不能实现。帮我看看程序吧,版老大

头文件QTextEditEx.h
---------------------------------------------------------------
#ifndef QTEXTEDITEX_H
#define QTEXTEDITEX_H

#include <QTextEdit>
class QMenu;
class QAction;

class QTextEditEx : public QTextEdit
{
    Q_OBJECT

public:
    QTextEditEx(QWidget * parent = 0);
    ~QTextEditEx();

private slots:

    void customContextMenuRequestedSlot(const QPoint &pos);

private:
    QMenu    *menu;
    QAction    *clrAll;
       
};

#endif
---------------------------------------------------------------

cpp文件QTextEditEx.cpp
---------------------------------------------------------------
#include "QTextEditEx.h"

#include <QMenu>
#include <QAction>

QTextEditEx::QTextEditEx(QWidget * parent)
    : QTextEdit(parent)
{
    menu    =    0;
    clrAll    =    new QAction("&Clear All", this);

    connect(this, SIGNAL(customContextMenuRequested()), this, SLOT(customContextMenuRequestedSlot));
}

void QTextEditEx::customContextMenuRequestedSlot(const QPoint &pos)
{
    menu = createStandardContextMenu();
    menu->addAction(clrAll);
    menu->popup(this->mapToGlobal(pos));
}

QTextEditEx::~QTextEditEx()
{
    if(menu != 0)
    {
        delete menu;
        menu = 0;
    }
    if(clrAll != 0)
    {
        delete clrAll;
        clrAll = 0;
    }
}
--------------------------------------------------------------
现在的问题是context menu根本就没弹出来。将contextMenuPolicy设置成ActionsContextMenu和Qt::CustomContextMenu都不行。
离线XChinux

只看该作者 8楼 发表于: 2008-03-31
void Form::on_lineEdit_2_customContextMenuRequested(const QPoint &pos)
{
popupMenu = new QMenu(lineEdit_2);
popupMenu->addAction("Custom Menu 1");
  popupMenu->popup(lineEdit_2->mapToGlobal(pos));
}

接收customContextMenuRequested()信号即可。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线levine
只看该作者 7楼 发表于: 2008-03-31
这样不行啊,版老大
你看我的做法是对的吗?
1.就是像你说的,把文本编辑器控件提升为类QTextEditEx,然后实现QTextEditEx.h和QTextEditEx.cpp
----------------------------------------------------------------------------QTextEditEx.h
#ifndef QTEXTEDITEX_H
#define QTEXTEDITEX_H

#include <QTextEdit>
class QMenu;
class QAction;

class QTextEditEx : public QTextEdit
{
    Q_OBJECT

public:
    QTextEditEx(QWidget * parent = 0);
    ~QTextEditEx();

    virtual void contextMenuEvent(QContextMenuEvent * event);

private slots:

    void clearAll(void);

private:
    QMenu    *menu;
    QAction    *clrAll;
       
};

#endif
----------------------------------------------------------------------------QTextEditEx.h
----------------------------------------------------------------------------QTextEditEx.cpp
#include "QTextEditEx.h"

#include <QMenu>
#include <QAction>
#include <QContextMenuEvent>

QTextEditEx::QTextEditEx(QWidget * parent)
    : QTextEdit(parent)
{
    menu    =    0;
    clrAll    =    new QAction("&Clear All", this);

    connect(clrAll, SIGNAL(triggered()), this, SLOT(clearAll()));
}

void QTextEditEx::contextMenuEvent(QContextMenuEvent * event)
{
     QMenu *menu    =    createStandardContextMenu();
    menu->addAction(clrAll);
    menu->exec(event->globalPos());
    //delete menu;
}

void QTextEditEx::clearAll()
{
    clear();
}

QTextEditEx::~QTextEditEx()
{
    if(menu != 0)
    {
        delete menu;
        menu = 0;
    }
    if(clrAll != 0)
    {
        delete clrAll;
        clrAll = 0;
    }
}
----------------------------------------------------------------------------QTextEditEx.cpp
2.设置文本编辑器控件对象名为textEditor并设置属性ContextMenuPolicy为Qt::ActionsContextMenu
3.在程序中直接用textEditor,我没有包含头文件QTextEditEx.h。(好像包含了也不行)

我想给文本编辑器增加“右键->Clear All->清除全部”的功能。我这样的做法哪儿错了呢?
谢谢啊!
离线XChinux

只看该作者 6楼 发表于: 2008-03-31
属性完全从QTextEdit继承过来,和以前的用法一样。
如果菜单比较简单,就不用重新实现contextMenuEvent(),直接将contextMenuPolicy设置成ActionsContextMenu即可,如果比较复杂,则用contextMenuEvent()来自己设计菜单。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线levine
只看该作者 5楼 发表于: 2008-03-30
版老大::
我还有两个问题要问:
1.原来QTextEdit控件的属性怎么设置?Qt::CustomContextMenu?还是Qt::DefaultContextMenu?或者其他的?
2.需要显式的在程序里包含新类的头文件和new一个创建的类吗?
因为我还没有实验成功呢。谢谢啊!
离线XChinux

只看该作者 4楼 发表于: 2008-03-29
在Designer上的部件上点击右键菜单中的“提升为..."菜单在弹出的对话框中给新类起一个名字及文件名。
然后创建相应的文件及类,从你对应的部件类中继承过来,实现相应的虚函数即可。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线levine
只看该作者 3楼 发表于: 2008-03-27
非要继承QTextEdit?
但是如果直接把TextEdit画出来了,想重新实现一些虚函数,要怎么实现啊?
毕竟画界面的时候可以选择的项很有限啊!比如我想重新实现一下ContextMenu
有没有人知道啊?这个问题应该值得讨论一下吧?
离线levine
只看该作者 2楼 发表于: 2008-03-27
谢谢mendynew !
第一个可以实现了。
第二个不知道怎么做,我是直接把界面画出来的,这样的话能重新实现TextEdit的contextMenuEvent (QContextMenuEvent *e)函数吗?
离线mendynew
只看该作者 1楼 发表于: 2008-03-27
问题1.打印信息之前先判断光标是不是定位到了最后一行,如果没有,将光标移到最后,再添加文本。
QTextCursor cursor = this->textCursor();
if(!cursor.atEnd())
{
cursor.movePosition(QTextCursor::End,QTextCursor::MoveAnchor,1);
this->setTextCursor(cursor);
}
cursor.insertText(str);

问题2.
实现contextMenuEvent (QContextMenuEvent *e)函数。
快速回复
限100 字节
 
上一个 下一个