Qt中使用dock(浮窗)是一个多界面编程的很好的思路。
一、操作步骤
(1)新建一个widget的继承类(如myWidget);
(2)在继承类myWidget的函数中添加各控件;
(3)在继承类myWidget中将各控件添加到一个layout中,并在该类下执行setLayout函数。
(4)在主窗口(MainWindow)中新建一个QDockWidget对象、一个myWidget对象。
(5)在该QDockWidget对象中执行setwidget函数,输入参数时myWidget对象。
二、小技巧
(1)与菜单项联系起来:
在菜单栏中利用QDockWidget中的toggleViewAction,将dock浮窗和菜单栏中的菜单项联系起来。
(2)将多个dock浮窗折叠起来:tabifyDockWidget
(3)四个边均有dock浮窗时,设置角落归谁的代码:
setCorner(Qt::BottomLeftCorner,Qt::LeftDockWidgetArea);//让左下角区域归于左边停靠区域
setCorner(Qt::BottomRightCorner,Qt::RightDockWidgetArea);//让右下角区域归于右边停靠区域
setCorner(Qt::TopLeftCorner,Qt::LeftDockWidgetArea);//让左上角区域归于左边停靠区域
setCorner(Qt::TopRightCorner,Qt::RightDockWidgetArea);//让右上角区域归于右边停靠区域
三、代码实例
(1)form_widget.h
#ifndef FORM_WIDGET_H
#define FORM_WIDGET_H
#include
#include
#include
#include
namespace Ui {
class Form_Widget;
}
class Form_Widget : public QWidget
{
Q_OBJECT
public:
explicit Form_Widget(QWidget *parent = 0);
~Form_Widget();
private:
Ui::Form_Widget *ui;
QPushButton *m_button1;
QPushButton *m_button2;
QLineEdit *m_lineedit1;
QLineEdit *m_lineedit2;
QGridLayout *m_layout;
public:
void func_create_widget();
};
#endif // FORM_WIDGET_H
(2)mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include "form_widget.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
Form_Widget *m_widget_example;
QDockWidget *m_dock1;
QMenu *m_ViewMenu;
public:
void func_create_widget_dock();
void func_create_menu();
};
#endif // MAINWINDOW_H
(3)form_widget.cpp
#include "form_widget.h"
#include "ui_form_widget.h"
Form_Widget::Form_Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form_Widget)
{
ui->setupUi(this);
func_create_widget();
}
Form_Widget::~Form_Widget()
{
delete ui;
}
void Form_Widget::func_create_widget()
{
m_button1 = new QPushButton("button 1");
m_button2 = new QPushButton("button 2");
m_lineedit1 = new QLineEdit("lineedit 1");
m_lineedit2 = new QLineEdit("lineedit 2");
m_layout = new QGridLayout;
m_layout->addWidget(m_lineedit1,0,0,1,1);
m_layout->addWidget(m_button1,0,1,1,1);
m_layout->addWidget(m_lineedit2,1,0,1,1);
m_layout->addWidget(m_button2,1,1,1,1);
this->setLayout(m_layout);
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->resize(QSize(800,600));
func_create_widget_dock();
func_create_menu();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::func_create_widget_dock()
{
m_dock1 = new QDockWidget(this);
m_widget_example = new Form_Widget;
m_dock1->setWindowTitle("dock 1");
m_dock1->setWidget(m_widget_example);
this->addDockWidget(Qt::RightDockWidgetArea,m_dock1);
}
void MainWindow::func_create_menu()
{
m_ViewMenu = new QMenu(this);
m_ViewMenu = menuBar()->addMenu(QString::fromLocal8Bit("窗口"));
m_ViewMenu->addAction(m_dock1->toggleViewAction());
}
(5)main.cpp
#include "mainwindow.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
四、界面实例
20171117