1 主窗口框架
1.1 菜单栏和工具栏
(1)通过Qt creator 2.2 创建main window类型工程,可通过ui文件或者新建指针变量来创建菜单和工具栏。
(2)&F就是加速键和快捷键的指示方式。
(3)使用资源加载图标。
(4)工具栏。定义依存于this的新指针,并在工具栏上add widget即可。
1.2 中心部件
通过ui可放置一个Text Edit控件,之后空白处点击CTRL+G可布置栅格布局。
拖入MDI部件,在ACTION管理器-新建上转到槽。编写回调函数文件。
#include <QTextEdit>
#include <QMdiSubWindow>
QTextEdit *td = new QTextEdit(this);
QMdiSubWindow *sub = ui->mdiArea->addSubWindow(td);
sub->show();
1.3 Dock部件(停靠控件)
直接拖入DOCK WIDGET即可。可在目录里在新建一个显示ACTION,编辑回调函数。
void MainWindow::on_action_DOCK_triggered()
{
ui->dockWidget->show();
}
1.4 状态栏
目前版本不支持向状态栏拖放部件,使用代码形式完成。
1.5 自定义菜单
自定义菜单实现了向菜单中添加控件,需要定义并使用QWIDGETACTION的派生类。通过这个也可以学习下怎么定义新的类。
#include <QWidgetAction>
class QLineEdit;
class myaction : public QWidgetAction
{
Q_OBJECT
public:
explicit myaction(QObject *parent = 0);
protected:
QWidget *createWidget(QWidget *parent);
signals:
void getText(const QString &string);
public slots:
void sendText();
private:
QLineEdit *lineEdit;
};
#endif // MYACTION_H
#include "myaction.h"
#include <QLineEdit>
#include <QSplitter>
#include <QLabel>
myaction::myaction(QObject *parent) :
QWidgetAction(parent)
{
lineEdit = new QLineEdit;
connect(lineEdit,SIGNAL(returnPressed()),this,SLOT(sendText()));
}
QWidget *myaction::createWidget(QWidget *parent)
{
QSplitter *s = new QSplitter(parent);
QLabel *l = new QLabel;
l->setText("sss");
s->addWidget(l);
s->addWidget(lineEdit);
return s;
}
void myaction::sendText()
{
emit getText(lineEdit->text());
lineEdit->clear();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_action_triggered();
void on_action_DOCK_triggered();
void setText(const QString &str);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "myaction.h"
myaction *a = new myaction;
QMenu *editMenu = ui->menuBar->addMenu(tr("编辑"));
editMenu->addAction(a);
connect(a,SIGNAL(getText(QString)),this,SLOT(setText(QString)));
void MainWindow::setText(const QString &str){
ui->textEdit->setText(str);
}
值得注意的是,getText信号直接在sendText里用到了,信号和槽的机理还得继续研究。
举一反三,看看如何使用ui实现这个槽。新建一个mainwindow工程,在主界面拉入lineedit和textedit,在mainwindow头文件中声明槽,在cpp文件中实现以下,在构造函数中编辑connect函数(信号与槽编辑器貌似无法识别自定义的槽)
// IN H FILE
public slots:
void mySetText();
// IN CONSTRUCTOR
connect(ui->L1,SIGNAL(returnPressed()),this,SLOT(mySetText()));
// IN CPP FILE
void MainWindow::mySetText()
{
ui->textEdit->append(ui->L1->text());
}
注意:信号与槽的形参要对应,如果信号没有参数,槽也没有参数。
2 富文本处理
2.1 富文本文档结构
// in constructor
QTextDocument *doc = ui->textEdit->document();
QTextFrame *rootFrame = doc->rootFrame();
QTextFrameFormat fmt;
fmt.setBorderBrush(Qt::red);
fmt.setBorder(3);
rootFrame->setFrameFormat(fmt);
QTextFrameFormat fmt1;
fmt1.setBackground(Qt::gray);
fmt1.setBorderBrush(Qt::black);
fmt1.setBorder(2);
fmt1.setBorderStyle(QTextFrameFormat::BorderStyle_Dashed);
QTextCursor cs = ui->textEdit->textCursor();
cs.insertFrame(fmt1);