Qt打印预览功能实现疑问:(QPrintPreviewDialog)

neicole 2012-03-02 11:11:43
Qt打印预览功能实现疑问:(QPrintPreviewDialog)

由于需要用到打印预览的功能,于是,Qt Assistant查阅打印预览对话框的使用方法,同时,Qt Demo中查阅相关例子,写出下列程序,但是,程序结果并不能将所创建的QTextEdit内容映入到QPrintPreviewDialog的内容中。即假如我在QTextEdit对象中加入了字符“ABC”,但在QPrintPreviewDialog中还是显示为空。
该如何解决这个问题呢?

已定义了一个类
classsingleText: public QTextEdit
{
Q_OBJECT
public:
singleText(parent * p);
filePrintPreview();
...
};

下面是打印预览功能的实现:
// 打印预览
void singleText::filePrintPreview()
{
QPrinter printer(QPrinter::HighResolution);
QPrintPreviewDialog preview(&printer, this);
preview.showNormal ();
preview.setWindowTitle(fileName + tr(" 文件打印预览"));
connect(&preview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(print(QPrinter*)));
preview.exec();
return;
}


带着为什么不能将内容显示进入QPrintPreviewDialog中,将逐个语句再理解一次,另外,还有一点不明白的是,在这个函数中,是什么时候将QTextEdit的内容放入到QPrintPreviewDialog中的呢?
在QPrintPreviewDialog中调入的参数有何用?是为了将这个内容导入?但是它不是一个新建的对象吗?
于是:查阅资料:尝试理解,手工翻译了一下大概意思(本人英语烂烂的,如有出入,希望能校正)。
The QPrinter class is a paint device that paints on aprinter.
QPrinter可以画在“绘图”设备上。可以绘制几何图形。
This device represents a series of pages of printedoutput, and is used in almost exactly the same way as other paint devices suchas QWidget and QPixmap.A set of additional functions are provided to manage device-specific features,such as orientation and resolution, and to step through the pagesin a document as it is generated.
这个设备代表了一系列的输出设备页面,并且它还跟其它的绘图设备 QWidget 和 QPixmap这些具有相同的使用方式。它的特殊的管理方式提供一组增加的功能,如,并且通过文档的页面逐渐产生情况和解决方法。
When printing directly to a printer on Windows or Mac OSX, QPrinter uses the built-in printer drivers. On X11, QPrinter uses the Common Unix PrintingSystem (CUPS) or the standard Unix lpr utilityto send PostScript or PDF output to the printer. As analternative, the printProgram() function can be used to specifythe command or utility to use instead of the system default.
当这个直接绘制一个printer在windows或者苹果系统上,QPrinter使用built-in printer 设备。在X11上,QPrinter使用普通的单元绘制系统或者标准的实用单元发送附言或者pdf输出到printer(这个printer应该是指对象吧)上。由于有可选性,这个printProgram()功能可以被普通的或者实用地去使用,代替了系统默认。
Note that setting parameterslike paper size and resolution on an invalid printer is undefined. You can use QPrinter::isValid() to verify this beforechanging any parameters.
注意设置参数(像纸张大小和解决方法)在一个不定义的无效的printer上。在改变其它参数前你可以使用QPrinter::isVaild()去查证这一点。(简单地说就是用isVaild()可以检验函数的有效性。)


其中在使用中的语句有下面:
QPrinter::HighResolution
On Windows, setsthe printer resolution to that defined for the printer in use. For PostScriptprinting, sets the resolution of the PostScript driver to 1200 dpi.
Note: Whenrendering text on a QPrinter device, it is important to realize that thesize of text, when specified in points, is independent of the resolutionspecified for the device itself. Therefore, it may be useful to specify thefont size in pixels when combining text with graphics to ensure that theirrelative sizes are what you expect.
注意:当在QPrinter设备中实施文本,非常重要去知道text的大小,当它在points,当它指定points,独立的解决方法在自身设备中有指定。否则,当与文本合并图像,它将指定字体大小去确定跟它们有关系的你所采用的大小。
看完这些后,QPrinter的作用自己大概理解成是一种可以定义图像,文本之类的属性的类,并且还支持一些特殊的输出功能。只是。。。当初想要解决的疑问还是没有解决,这个时候有指定将QTextEdit中的内容添加进去么,
QPrinter printer(QPrinter::HighResolution);只是为了定义预览的格式质量吧?
然后,带着为什么这个不能正常在QPrinterPreviewDialog中显示的问题,继续查QPrinterPreviewDialog的相关介绍。。。
Detailed Description
The QPrintPreviewDialog class provides a dialog forpreviewing and configuring page layouts for printer output.
Using QPrintPreviewDialog in your existing application isstraightforward:
Createthe QPrintPreviewDialog.
You can construct a QPrintPreviewDialogwith an existing QPrinter object, or you can haveQPrintPreviewDialog create one for you, which will be the system defaultprinter.
Connectthe paintRequested() signal to a slot.
When the dialog needs to generate a setof preview pages, the paintRequested() signal will be emitted. Youcan use the exact same code for the actual printing as for having the previewgenerated, including calling QPrinter::newPage() to start a new page in thepreview. Connect a slot to thepaintRequested() signal, where you draw ontothe QPrinter object that is passed into theslot.
Call exec().
Call QPrintPreviewDialog::exec() to show thepreview dialog.
In Symbian, there is no support for printing. Hence, thisdialog should not be used in Symbian.

一些相关的函数:
QPrintPreviewDialog( QPrinter * printer, QWidget * parent = 0, Qt::WindowFlags flags = 0 );
QPrintPreviewDialog( QWidget * parent = 0, Qt::WindowFlags flags = 0 );
~QPrintPreviewDialog();
void open ( QObject * receiver, const char *member );
QPrinter* printer ();

构造函数的声明
QPrintPreviewDialog::QPrintPreviewDialog ( QPrinter * printer, QWidget * parent =0, Qt::WindowFlags flags =0 )
[size=font-size:10.5pt,10.5pt]Constructs a QPrintPreviewDialog based on printer and with parent as the parent widget. The widget flags flags are passed on to the QWidget constructor.

看完了这些,还是没有解决疑问,这几段内容,大概讲了怎么去构造使用这个QPrinterPreviewDialog,不过还是不知道如何将原来的设置值放入到这个dialog中。。。
另外,现在在写的函数还有三个功能没有实现,还有两个功能也是同样的问题,QPrinter的打印功能,还有QPageSetupDialog这功能,不过可能这些都是相通的问题,所以在这里想先请教大家如何去解决这些问题呢?
或者说,
QPageSetupDialog与QTextEdit的数据参数相连接口在哪里呢?
QPrinterPreviewDialog与QTextEdit的数据参数接口在哪里呢?
QPrinter与QTextEdit的数据参数的接口又是在哪里呢?

本人菜鸟,初学Qt,也查阅过不少资料,问题实在靠自己的力量解决,所以在这里带着疑问请教大家,望能解决问题~
...全文
1573 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shelmi 2013-07-30
  • 打赏
  • 举报
回复
请问一下,你是怎么正常使用QPrinter,因为我一用那个就出问题,总是提示undefined reference to'imp_XXQPrinter'之类的,好像是在pro里面怎么搞,但是我查不到,麻烦知道的话告诉一下下
ARMBULL 2012-09-03
  • 打赏
  • 举报
回复
我的QT程序在Windows版本下,可以用QPrintPreviewDialog做漂亮的预览.
当把QT移植到linux下的ARM开发板上运行,一点打印预览按钮,程序就退出了.
我移植的QT是4.5的,QPrintPreviewDialog在4.4中就有了.所以我想问下你在ARM板卡上能用打印预览功能不?

[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:
你的打印预览功能加到ARM板卡上能用吗?


呵呵,表示技术有限,听不懂~
[/Quote]
ARMBULL 2012-09-03
  • 打赏
  • 举报
回复
我的QT程序在Windows版本下,可以用QPrintPreviewDialog做漂亮的预览.
当把QT移植到linux下的ARM开发板上运行,一点打印预览按钮,程序就退出了.
我移植的QT是4.5的,QPrintPreviewDialog在4.4中就有了.所以我想问下你在ARM板卡上能用打印预览功能不?

[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:
你的打印预览功能加到ARM板卡上能用吗?


呵呵,表示技术有限,听不懂~
[/Quote]
neicole 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
你的打印预览功能加到ARM板卡上能用吗?
[/Quote]

呵呵,表示技术有限,听不懂~
ARMBULL 2012-08-29
  • 打赏
  • 举报
回复
你的打印预览功能加到ARM板卡上能用吗?
neicole 2012-03-04
  • 打赏
  • 举报
回复
今天,再在网上查了一下资料,无意中发现,翻译与自己翻译的果然有点不同,一看这个翻译,知道使用方法了:


详细描述:
使用该类在你存在的应用中,是简单的
1. 创建该类
你能构造一个该类用一个存在的QPrinter对象,或者你能用QPrintPreviewDialog来创建一个为你,这将是系统默认的指针。
2. 连接paintRequested()信号到一个槽
当对话框需要产生一系列预览页时,paintRequested()信号将被发出。你能使用准确的相同的代码为实际的打印就像有预览被产生,包括调用QPrinter::newPage()来开始一个新页。连接一个槽到paintRequested()信号,那里你将画出QPinter对象。
3. 调用exec()
调用QPrintPreviewDialog::exec()来显示预览框。
See also QPrinter, QPrintDialog, QPageSetupDialog, and QPrintPreviewWidget.



原来主要连接点在第二点那里有提到,当其与打印功能连通时,则会自动生成打印预览的效果~
neicole 2012-03-04
  • 打赏
  • 举报
回复
大家有qpagesetupdialog 的例子吗?

想将这个dialog的设置读取且应用到QTextEdit中,求指导~

// 页面设置
void singleText::filePagesetup()
{
QPrinter printer(QPrinter::HighResolution);
QPageSetupDialog * psd = new QPageSetupDialog(&printer, this);
psd -> setWindowTitle(fileName + tr(" 文件页面设置"));
QPrinter * pageSetupPrinter = psd -> printer();
pageSetupPrinter -> setOutputFormat(QPrinter::NativeFormat);
psd -> exec();
return;
}

上面这个是个人写的不能应用上去的代码。
neicole 2012-03-03
  • 打赏
  • 举报
回复
呜呜,求解决~~~ CSDN的Qt好像还真的是比较少人啊~
#include #include #include #include Dialog> #include #include #include #include Dialog> #include #include #include #include #include <QTextCodec> #include <QTextEdit> #include <QToolBar> #include <QTextCursor> #include <QTextDocumentWriter> #include <QTextList> #include <QtDebug> #include #include #include #ifndef QT_NO_PRINTER #include <QPrintDialog> #include <QPrinter> #include <QPrintPreviewDialog> #endif #include "textedit.h" #ifdef Q_OS_MAC const QString rsrcPath = ":/images/mac"; #else const QString rsrcPath = ":/images/win"; #endif TextEdit::TextEdit(QWidget *parent) : QMainWindow(parent) { #ifdef Q_OS_OSX setUnifiedTitleAndToolBarOnMac(true); #endif setToolButtonStyle(Qt::ToolButtonFollowStyle); setupFileActions(); setupEditActions(); setupTextActions(); { QMenu *helpMenu = new QMenu(tr("Help"), this); menuBar()->addMenu(helpMenu); helpMenu->addAction(tr("About"), this, SLOT(about())); helpMenu->addAction(tr("About &Qt"), qApp, SLOT(aboutQt())); } textEdit = new QTextEdit(this); connect(textEdit, SIGNAL(currentCharFormatChanged(QTextCharFormat)), this, SLOT(currentCharFormatChanged(QTextCharFormat))); connect(textEdit, SIGNAL(cursorPositionChanged()), this, SLOT(cursorPositionChanged())); setCentralWidget(textEdit); textEdit->setFocus(); setCurrentFileName(QString()); QFont textFont("Helvetica"); textFont.setStyleHint(QFont::SansSerif); textEdit->setFont(textFont); fontChanged(textEdit->font()); colorChanged(textEdit->textColor()); alignmentChanged(textEdit->alignment()); connect(textEdit->document(), SIGNAL(modificationChanged(bool)), actionSave, SLOT(setEnabled(bool))); connect(textEdit->document(), SIGNAL(modificationChanged(bool)), this, SLOT(setWindowModified(bool))); connect(textEdit->document(), SIGNAL(undoAvailable(bool)), actionUndo, SLOT(setEnabled(bool))); connect(textEdit->document(), SIGNAL(redoAvailable(bool)), actionRedo, SLOT(setEnabled(bool))); setWindowModified(textEdit->document()->isModified()); actionSave->setEnabled(textEdit->document()->isModified()); actionUndo->setEnabled(textEdit->document()->isUndoAvailable()); actionRedo->setEnabled(textEdit->document()->isRedoAvailable()); connect(actionUndo, SIGNAL(triggered()), textEdit, SLOT(undo())); connect(actionRedo, SIGNAL(triggered()), textEdit, SLOT(redo())); actionCut->setEnabled(false); actionCopy->setEnabled(false); connect(actionCut, SIGNAL(triggered()), textEdit, SLOT(cut())); connect(actionCopy, SIGNAL(triggered()), textEdit, SLOT(copy())); connect(actionPaste, SIGNAL(triggered()), textEdit, SLOT(paste())); connect(textEdit, SIGNAL(copyAvailable(bool)), actionCut, SLOT(setEnabled(bool))); connect(textEdit, SIGNAL(copyAvailable(bool)), actionCopy, SLOT(setEnabled(bool))); #ifndef QT_NO_CLIPBOARD connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(clipboardDataChanged())); #endif QString initialFile = ":/example.html"; const QStringList args = QCoreApplication::arguments(); if (args.count() == 2) initialFile = args.at(1); if (!load(initialFile)) fileNew(); } void TextEdit::closeEvent(QCloseEvent *e) { if (maybeSave()) e->accept(); else e->ignore(); } void TextEdit::setupFileActions() { QToolBar *tb = new QToolBar(this); tb->setWindowTitle(tr("File Actions")); addToolBar(tb); QMenu *menu = new QMenu(tr("&File"), this); menuBar()->addMenu(menu); QAction *a; QIcon newIcon = QIcon::fromTheme("document-new", QIcon(rsrcPath + "/filenew.png")); a = new QAction( newIcon, tr("&New"), this); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::New); connect(a, SIGNAL(triggered()), this, SLOT(fileNew())); tb->addAction(a); menu->addAction(a); a = new QAction(QIcon::fromTheme("document-open", QIcon(rsrcPath + "/fileopen.png")), tr("&Open..."), this); a->setShortcut(QKeySequence::Open); connect(a, SIGNAL(triggered()), this, SLOT(fileOpen())); tb->addAction(a); menu->addAction(a); menu->addSeparator(); actionSave = a = new QAction(QIcon::fromTheme("document-save", QIcon(rsrcPath + "/filesave.png")), tr("&Save"), this); a->setShortcut(QKeySequence::Save); connect(a, SIGNAL(triggered()), this, SLOT(fileSave())); a->setEnabled(false); tb->addAction(a); menu->addAction(a); a = new QAction(tr("Save &As..."), this); a->setPriority(QAction::LowPriority); connect(a, SIGNAL(triggered()), this, SLOT(fileSaveAs())); menu->addAction(a); menu->addSeparator(); #ifndef QT_NO_PRINTER a = new QAction(QIcon::fromTheme("document-print", QIcon(rsrcPath + "/fileprint.png")), tr("&Print..."), this); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::Print); connect(a, SIGNAL(triggered()), this, SLOT(filePrint())); tb->addAction(a); menu->addAction(a); a = new QAction(QIcon::fromTheme("fileprint", QIcon(rsrcPath + "/fileprint.png")), tr("Print Preview..."), this); connect(a, SIGNAL(triggered()), this, SLOT(filePrintPreview())); menu->addAction(a); a = new QAction(QIcon::fromTheme("exportpdf", QIcon(rsrcPath + "/exportpdf.png")), tr("&Export PDF..."), this); a->setPriority(QAction::LowPriority); a->setShortcut(Qt::CTRL + Qt::Key_D); connect(a, SIGNAL(triggered()), this, SLOT(filePrintPdf())); tb->addAction(a); menu->addAction(a); menu->addSeparator(); #endif a = new QAction(tr("&Quit"), this); a->setShortcut(Qt::CTRL + Qt::Key_Q); connect(a, SIGNAL(triggered()), this, SLOT(close())); menu->addAction(a); } void TextEdit::setupEditActions() { QToolBar *tb = new QToolBar(this); tb->setWindowTitle(tr("Edit Actions")); addToolBar(tb); QMenu *menu = new QMenu(tr("&Edit"), this); menuBar()->addMenu(menu); QAction *a; a = actionUndo = new QAction(QIcon::fromTheme("edit-undo", QIcon(rsrcPath + "/editundo.png")), tr("&Undo"), this); a->setShortcut(QKeySequence::Undo); tb->addAction(a); menu->addAction(a); a = actionRedo = new QAction(QIcon::fromTheme("edit-redo", QIcon(rsrcPath + "/editredo.png")), tr("&Redo"), this); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::Redo); tb->addAction(a); menu->addAction(a); menu->addSeparator(); a = actionCut = new QAction(QIcon::fromTheme("edit-cut", QIcon(rsrcPath + "/editcut.png")), tr("Cu&t"), this); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::Cut); tb->addAction(a); menu->addAction(a); a = actionCopy = new QAction(QIcon::fromTheme("edit-copy", QIcon(rsrcPath + "/editcopy.png")), tr("&Copy"), this); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::Copy); tb->addAction(a); menu->addAction(a); a = actionPaste = new QAction(QIcon::fromTheme("edit-paste", QIcon(rsrcPath + "/editpaste.png")), tr("&Paste"), this); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::Paste); tb->addAction(a); menu->addAction(a); #ifndef QT_NO_CLIPBOARD if (const QMimeData *md = QApplication::clipboard()->mimeData()) actionPaste->setEnabled(md->hasText()); #endif } void TextEdit::setupTextActions() { QToolBar *tb = new QToolBar(this); tb->setWindowTitle(tr("Format Actions")); addToolBar(tb); QMenu *menu = new QMenu(tr("F&ormat"), this); menuBar()->addMenu(menu); actionTextBold = new QAction(QIcon::fromTheme("format-text-bold", QIcon(rsrcPath + "/textbold.png")), tr("&Bold"), this); actionTextBold->setShortcut(Qt::CTRL + Qt::Key_B); actionTextBold->setPriority(QAction::LowPriority); QFont bold; bold.setBold(true); actionTextBold->setFont(bold); connect(actionTextBold, SIGNAL(triggered()), this, SLOT(textBold())); tb->addAction(actionTextBold); menu->addAction(actionTextBold); actionTextBold->setCheckable(true); actionTextItalic = new QAction(QIcon::fromTheme("format-text-italic", QIcon(rsrcPath + "/textitalic.png")), tr("&Italic"), this); actionTextItalic->setPriority(QAction::LowPriority); actionTextItalic->setShortcut(Qt::CTRL + Qt::Key_I); QFont italic; italic.setItalic(true); actionTextItalic->setFont(italic); connect(actionTextItalic, SIGNAL(triggered()), this, SLOT(textItalic())); tb->addAction(actionTextItalic); menu->addAction(actionTextItalic); actionTextItalic->setCheckable(true); actionTextUnderline = new QAction(QIcon::fromTheme("format-text-underline", QIcon(rsrcPath + "/textunder.png")), tr("&Underline"), this); actionTextUnderline->setShortcut(Qt::CTRL + Qt::Key_U); actionTextUnderline->setPriority(QAction::LowPriority); QFont underline; underline.setUnderline(true); actionTextUnderline->setFont(underline); connect(actionTextUnderline, SIGNAL(triggered()), this, SLOT(textUnderline())); tb->addAction(actionTextUnderline); menu->addAction(actionTextUnderline); actionTextUnderline->setCheckable(true); menu->addSeparator(); QActionGroup *grp = new QActionGroup(this); connect(grp, SIGNAL(triggered(QAction*)), this, SLOT(textAlign(QAction*))); // Make sure the alignLeft is always left of the alignRight if (QApplication::isLeftToRight()) { actionAlignLeft = new QAction(QIcon::fromTheme("format-justify-left", QIcon(rsrcPath + "/textleft.png")), tr("&Left"), grp); actionAlignCenter = new QAction(QIcon::fromTheme("format-justify-center", QIcon(rsrcPath + "/textcenter.png")), tr("C&enter"), grp); actionAlignRight = new QAction(QIcon::fromTheme("format-justify-right", QIcon(rsrcPath + "/textright.png")), tr("&Right"), grp); } else { actionAlignRight = new QAction(QIcon::fromTheme("format-justify-right", QIcon(rsrcPath + "/textright.png")), tr("&Right"), grp); actionAlignCenter = new QAction(QIcon::fromTheme("format-justify-center", QIcon(rsrcPath + "/textcenter.png")), tr("C&enter"), grp); actionAlignLeft = new QAction(QIcon::fromTheme("format-justify-left", QIcon(rsrcPath + "/textleft.png")), tr("&Left"), grp); } actionAlignJustify = new QAction(QIcon::fromTheme("format-justify-fill", QIcon(rsrcPath + "/textjustify.png")), tr("&Justify"), grp); actionAlignLeft->setShortcut(Qt::CTRL + Qt::Key_L); actionAlignLeft->setCheckable(true); actionAlignLeft->setPriority(QAction::LowPriority); actionAlignCenter->setShortcut(Qt::CTRL + Qt::Key_E); actionAlignCenter->setCheckable(true); actionAlignCenter->setPriority(QAction::LowPriority); actionAlignRight->setShortcut(Qt::CTRL + Qt::Key_R); actionAlignRight->setCheckable(true); actionAlignRight->setPriority(QAction::LowPriority); actionAlignJustify->setShortcut(Qt::CTRL + Qt::Key_J); actionAlignJustify->setCheckable(true); actionAlignJustify->setPriority(QAction::LowPriority); tb->addActions(grp->actions()); menu->addActions(grp->actions()); menu->addSeparator(); QPixmap pix(16, 16); pix.fill(Qt::black); actionTextColor = new QAction(pix, tr("&Color..."), this); connect(actionTextColor, SIGNAL(triggered()), this, SLOT(textColor())); tb->addAction(actionTextColor); menu->addAction(actionTextColor); tb = new QToolBar(this); tb->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea); tb->setWindowTitle(tr("Format Actions")); addToolBarBreak(Qt::TopToolBarArea); addToolBar(tb); comboStyle = new QComboBox(tb); tb->addWidget(comboStyle); comboStyle->addItem("Standard"); comboStyle->addItem("Bullet List (Disc)"); comboStyle->addItem("Bullet List (Circle)"); comboStyle->addItem("Bullet List (Square)"); comboStyle->addItem("Ordered List (Decimal)"); comboStyle->addItem("Ordered List (Alpha lower)"); comboStyle->addItem("Ordered List (Alpha upper)"); comboStyle->addItem("Ordered List (Roman lower)"); comboStyle->addItem("Ordered List (Roman upper)"); connect(comboStyle, SIGNAL(activated(int)), this, SLOT(textStyle(int))); comboFont = new QFontComboBox(tb); tb->addWidget(comboFont); connect(comboFont, SIGNAL(activated(QString)), this, SLOT(textFamily(QString))); comboSize = new QComboBox(tb); comboSize->setObjectName("comboSize"); tb->addWidget(comboSize); comboSize->setEditable(true); QFontDatabase db; foreach(int size, db.standardSizes()) comboSize->addItem(QString::number(size)); connect(comboSize, SIGNAL(activated(QString)), this, SLOT(textSize(QString))); comboSize->setCurrentIndex(comboSize->findText(QString::number(QApplication::font() .pointSize()))); } bool TextEdit::load(const QString &f) { if (!QFile::exists(f)) return false; QFile file(f); if (!file.open(QFile::ReadOnly)) return false; QByteArray data = file.readAll(); QTextCodec *codec = Qt::codecForHtml(data); QString str = codec->toUnicode(data); if (Qt::mightBeRichText(str)) { textEdit->setHtml(str); } else { str = QString::fromLocal8Bit(data); textEdit->setPlainText(str); } setCurrentFileName(f); return true; } bool TextEdit::maybeSave() { if (!textEdit->document()->isModified()) return true; QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("Application"), tr("The document has been modified.\n" "Do you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); if (ret == QMessageBox::Save) return fileSave(); else if (ret == QMessageBox::Cancel) return false; return true; } void TextEdit::setCurrentFileName(const QString &fileName) { this->fileName = fileName; textEdit->document()->setModified(false); QString shownName; if (fileName.isEmpty()) shownName = "untitled.txt"; else shownName = QFileInfo(fileName).fileName(); setWindowTitle(tr("%1[*] - %2").arg(shownName).arg(tr("Rich Text"))); setWindowModified(false); } void TextEdit::fileNew() { if (maybeSave()) { textEdit->clear(); setCurrentFileName(QString()); } } void TextEdit::fileOpen() { QString fn = QFileDialog::getOpenFileName(this, tr("Open File..."), QString(), tr("HTML-Files (*.htm *.html);;All Files (*)")); if (!fn.isEmpty()) load(fn); } bool TextEdit::fileSave() { if (fileName.isEmpty()) return fileSaveAs(); if (fileName.startsWith(QStringLiteral(":/"))) return fileSaveAs(); QTextDocumentWriter writer(fileName); bool success = writer.write(textEdit->document()); if (success) textEdit->document()->setModified(false); return success; } bool TextEdit::fileSaveAs() { QString fn = QFileDialog::getSaveFileName(this, tr("Save as..."), QString(), tr("ODF files (*.odt);;HTML-Files " "(*.htm *.html);;All Files (*)")); if (fn.isEmpty()) return false; if (!(fn.endsWith(".odt", Qt::CaseInsensitive) || fn.endsWith(".htm", Qt::CaseInsensitive) || fn.endsWith(".html", Qt::CaseInsensitive))) { fn += ".odt"; // default } setCurrentFileName(fn); return fileSave(); } void TextEdit::filePrint() { #if !defined(QT_NO_PRINTER) && !defined(QT_NO_PRINTDIALOG) QPrinter printer(QPrinter::HighResolution); QPrintDialog *dlg = new QPrintDialog(&printer, this); if (textEdit->textCursor().hasSelection()) dlg->addEnabledOption(QAbstractPrintDialog::PrintSelection); dlg->setWindowTitle(tr("Print Document")); if (dlg->exec() == QDialog::Accepted) textEdit->print(&printer); delete dlg; #endif } void TextEdit::filePrintPreview() { #if !defined(QT_NO_PRINTER) && !defined(QT_NO_PRINTDIALOG) QPrinter printer(QPrinter::HighResolution); QPrintPreviewDialog preview(&printer, this); connect(&preview, SIGNAL(paintRequested(QPrinter*)), SLOT(printPreview(QPrinter*))); preview.exec(); #endif } void TextEdit::printPreview(QPrinter *printer) { #ifdef QT_NO_PRINTER Q_UNUSED(printer); #else textEdit->print(printer); #endif } void TextEdit::filePrintPdf() { #ifndef QT_NO_PRINTER QString fileName = QFileDialog::getSaveFileName(this, "Export PDF", QString(), "*.pdf"); if (!fileName.isEmpty()) { if (QFileInfo(fileName).suffix().isEmpty()) fileName.append(".pdf"); QPrinter printer(QPrinter::HighResolution); printer.setOutputFormat(QPrinter::PdfFormat); printer.setOutputFileName(fileName); textEdit->document()->print(&printer); } #endif } void TextEdit::textBold() { QTextCharFormat fmt; fmt.setFontWeight(actionTextBold->isChecked() ? QFont::Bold : QFont::Normal); mergeFormatOnWordOrSelection(fmt); } void TextEdit::textUnderline() { QTextCharFormat fmt; fmt.setFontUnderline(actionTextUnderline->isChecked()); mergeFormatOnWordOrSelection(fmt); } void TextEdit::textItalic() { QTextCharFormat fmt; fmt.setFontItalic(actionTextItalic->isChecked()); mergeFormatOnWordOrSelection(fmt); } void TextEdit::textFamily(const QString &f) { QTextCharFormat fmt; fmt.setFontFamily(f); mergeFormatOnWordOrSelection(fmt); } void TextEdit::textSize(const QString &p) { qreal pointSize = p.toFloat(); if (p.toFloat() > 0) { QTextCharFormat fmt; fmt.setFontPointSize(pointSize); mergeFormatOnWordOrSelection(fmt); } } void TextEdit::textStyle(int styleIndex) { QTextCursor cursor = textEdit->textCursor(); if (styleIndex != 0) { QTextListFormat::Style style = QTextListFormat::ListDisc; switch (styleIndex) { default: case 1: style = QTextListFormat::ListDisc; break; case 2: style = QTextListFormat::ListCircle; break; case 3: style = QTextListFormat::ListSquare; break; case 4: style = QTextListFormat::ListDecimal; break; case 5: style = QTextListFormat::ListLowerAlpha; break; case 6: style = QTextListFormat::ListUpperAlpha; break; case 7: style = QTextListFormat::ListLowerRoman; break; case 8: style = QTextListFormat::ListUpperRoman; break; } cursor.beginEditBlock(); QTextBlockFormat blockFmt = cursor.blockFormat(); QTextListFormat listFmt; if (cursor.currentList()) { listFmt = cursor.currentList()->format(); } else { listFmt.setIndent(blockFmt.indent() + 1); blockFmt.setIndent(0); cursor.setBlockFormat(blockFmt); } listFmt.setStyle(style); cursor.createList(listFmt); cursor.endEditBlock(); } else { // #### QTextBlockFormat bfmt; bfmt.setObjectIndex(-1); cursor.mergeBlockFormat(bfmt); } } void TextEdit::textColor() { QColor col = QColorDialog::getColor(textEdit->textColor(), this); if (!col.isValid()) return; QTextCharFormat fmt; fmt.setForeground(col); mergeFormatOnWordOrSelection(fmt); colorChanged(col); } void TextEdit::textAlign(QAction *a) { if (a == actionAlignLeft) textEdit->setAlignment(Qt::AlignLeft | Qt::AlignAbsolute); else if (a == actionAlignCenter) textEdit->setAlignment(Qt::AlignHCenter); else if (a == actionAlignRight) textEdit->setAlignment(Qt::AlignRight | Qt::AlignAbsolute); else if (a == actionAlignJustify) textEdit->setAlignment(Qt::AlignJustify); } void TextEdit::currentCharFormatChanged(const QTextCharFormat &format) { fontChanged(format.font()); colorChanged(format.foreground().color()); } void TextEdit::cursorPositionChanged() { alignmentChanged(textEdit->alignment()); } void TextEdit::clipboardDataChanged() { #ifndef QT_NO_CLIPBOARD if (const QMimeData *md = QApplication::clipboard()->mimeData()) actionPaste->setEnabled(md->hasText()); #endif } void TextEdit::about() { QMessageBox::about(this, tr("About"), tr("This example demonstrates Qt's " "rich text editing facilities in action, providing an example " "document for you to experiment with.")); } void TextEdit::mergeFormatOnWordOrSelection(const QTextCharFormat &format) { QTextCursor cursor = textEdit->textCursor(); if (!cursor.hasSelection()) cursor.select(QTextCursor::WordUnderCursor); cursor.mergeCharFormat(format); textEdit->mergeCurrentCharFormat(format); } void TextEdit::fontChanged(const QFont &f) { comboFont->setCurrentIndex(comboFont->findText(QFontInfo(f).family())); comboSize->setCurrentIndex(comboSize->findText(QString::number(f.pointSize()))); actionTextBold->setChecked(f.bold()); actionTextItalic->setChecked(f.italic()); actionTextUnderline->setChecked(f.underline()); } void TextEdit::colorChanged(const QColor &c) { QPixmap pix(16, 16); pix.fill(c); actionTextColor->setIcon(pix); } void TextEdit::alignmentChanged(Qt::Alignment a) { if (a & Qt::AlignLeft) actionAlignLeft->setChecked(true); else if (a & Qt::AlignHCenter) actionAlignCenter->setChecked(true); else if (a & Qt::AlignRight) actionAlignRight->setChecked(true); else if (a & Qt::AlignJustify) actionAlignJustify->setChecked(true); }

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧