QT--base20161125 layout嵌套使用

本文介绍了一个使用QT进行图形界面设计的实际案例,重点讲解了如何利用QGridLayout进行灵活的控件布局,包括控件的放置、对齐及间距调整等关键操作。
#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    QWidget w;
    w.setWindowTitle("Hello Wrold");


    QLineEdit edit;

    QPushButton button;
    button.setText("某某");
   // button.show();


#if 0
    layout.setColumnStretch(0,1);
    layout.setRowStretch(0,1);
    layout.setColumnStretch(3,1);
    layout.setRowStretch(4,1);

    layout.addWidget(&edit,1,1);
    layout.addWidget(&button,1,2);
    layout.addWidget(new QLineEdit("2,1"),2,1);
    layout.addWidget(new QPushButton("2,2"),2,2);

    //增加一个与与上面一样长的button
    layout.addWidget(new QPushButton("3,1"),3,1,1,2);
#endif
    QGridLayout layout;
    QLineEdit *password;
    layout.setColumnStretch(0,1);//为了使显示在最中间需要设置弹簧 
    layout.setRowStretch(0,1);
    layout.setColumnStretch(3,1);
    layout.setRowStretch(4,1);

    layout.addWidget(new QLabel("Username"),1,1);
    layout.addWidget(new QLineEdit(),1,2);
    layout.addWidget(new QLabel("Password"),2,1);
    layout.addWidget(password=new QLineEdit(),2,2);

    //layout.addWidget(new QPushButton("登录"),3,2);//这样显示的不好看 想在右边一点
    QHBoxLayout* hbox;
    layout.addLayout(hbox=new QHBoxLayout,3,2);//添加一个layout在这里 layout嵌套使用
    hbox->addStretch(1);
    hbox->addWidget(new QPushButton("登录"));
    password->setEchoMode(QLineEdit::Password);
    w.show();
    w.setLayout(&layout);



    return app.exec();
}

开发一个图形界面应用程序,界面的布局影响到界面的美观。在设计一个界面之前,应该考虑到开发的界面可能给不用的用户使用,而用户的屏幕大小、纵横比例、分辨率可能不同,界面还可能是可缩放的,程序应该可以适应这些变化。试想如果控件很多,布局这些控件需要编写大量的代码。幸运的是,QT提供了更好的方法布局控件。

        常用的三种布局方法:

(1)使用水平布局类QHBoxLayout;

(2)使用垂直布局类QVBoxLayout;

(3)使用网格布局类QGridLayout。

这里嵌套使用了后面两种。

QGridLayout的常用方法

(1)addWidget:

[cpp]  view plain  copy
  1. //放置一个控件到一个单元格  
  2. void    addWidget ( QWidget * widget, int row, int column, Qt::Alignment alignment = 0 )  
  3. //如果放置的控件超出一个单元格,则使用该方法  
  4. void    addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 )  

    1)row:指放置控件的网格行号(行号从0开始);

    2)colum:指放置控件的网格列号(从0开始);

    3)alignment:对齐方式。

    4)fromRow:指放置控件的起始网格行号;

    5)fromColumn:指放置控件的起始网格列号;

    6)rowSpan:指放置控件占多少行;

    7)columnSpan:指放置控件占多少列。


(2)addLayout

[cpp]  view plain  copy
  1. void    addLayout ( QLayout * layout, int row, int column, Qt::Alignment alignment = 0 )  
  2. void    addLayout ( QLayout * layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 )  

参数与addWidget类似。

(3)setSpacing

[cpp]  view plain  copy
  1. void QGridLayout::setSpacing ( int spacing ) 


### 如何在 Qt 中集成使用 RVIZ 插件 要在 Qt 应用程序中集成并使用 RVIZ 插件,可以通过 ROS 提供的 `rviz` API 来完成。以下是详细的配置指南示例代码。 #### 1. 创建 Qt 工程 首先,在 Qt Creator 或其他 IDE 中创建一个新的 C++ 工程,并确保该工程支持 ROS RVIZ 的编译环境。 #### 2. 添加必要的依赖项 为了使项目能够成功构建,需要将以下依赖项添加到项目的 `CMakeLists.txt` 文件中: ```cmake find_package(catkin REQUIRED COMPONENTS roscpp rviz ) catkin_package() include_directories( ${catkin_INCLUDE_DIRS} ) add_executable(your_qt_app src/main.cpp) target_link_libraries(your_qt_app ${catkin_LIBRARIES} ) ``` 这一步确保了应用程序可以访问 RVIZ 的核心库及其头文件[^5]。 #### 3. 初始化 RVIZ 组件 在 Qt 主窗口中嵌入 RVIZ 可视化组件时,通常会继承 `QMainWindow` 并在其内部初始化一个 `rviz::VisualizationFrame` 对象作为主要容器。 ##### 示例代码 下面是一个简单的例子,展示如何在一个 Qt 窗口中加载 RVIZ 插件: ```cpp #include <ros/ros.h> #include <rviz/visualization_manager.h> #include <rviz/display.h> #include <rviz/load_display.h> // 定义主窗口类 class MainWindow : public QMainWindow { public: MainWindow(QWidget* parent = nullptr); private: rviz::VisualizationManager* manager_; }; MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), manager_(nullptr) { // 设置布局管理器 QVBoxLayout* layout = new QVBoxLayout; // 创建 VisualizationManager 实例 ros::NodeHandle nh; manager_ = new rviz::VisualizationManager(this, nh); // 将 Manager 嵌套到 QWidget 上 QWidget* render_panel = manager_->getRenderPanel(); layout->addWidget(render_panel); // 加载默认插件 (例如 TF、Grid 等) try { rviz::Display* display = manager_->createDisplay("rviz/Grid", "grid", true); if(display != nullptr){ display->subProp("Line Style")->setValue(QString("Lines")); display->subProp("Color")->setValue(QVariant(QColor(255, 0, 0))); display->subProp("Cell Size")->setValue(1.0f); } } catch(const std::runtime_error& e){ qDebug() << "Error loading Grid plugin:" << QString(e.what()); } // 设置中心部件为主布局 QWidget* central_widget = new QWidget; central_widget->setLayout(layout); setCentralWidget(central_widget); } int main(int argc, char** argv) { QApplication app(argc, argv); ros::init(argc, argv, "qt_rviz_example"); MainWindow window; window.resize(800, 600); window.show(); return app.exec(); } ``` 此代码片段展示了如何设置一个基础的 RVIZ 显示框架,并加载了一个网格 (`Grid`) 插件用于测试目的[^4]。 #### 4. 注册自定义插件 如果希望开发自己的 RVIZ 插件,则需按照标准流程编写 XML 描述文件并将其实现导出给 PLUGINLIB 使用。具体操作如下所示: - **XML 描述文件** 在功能包目录下新增名为 `plugin_description.xml` 的文件,内容类似于这样: ```xml <library path="lib/libcustom_rviz_plugin"> <class name="my_custom_plugin/CustomRvizPlugin" type="my_custom_plugin::CustomRvizPlugin" base_class_type="rviz::Panel"> <description>A custom panel widget for testing.</description> </class> </library> ``` - **导出宏** 修改源码头部加入以下声明语句以便于动态加载机制识别新类型的对象实例: ```cpp #include <pluginlib/class_list_macros.hpp> PLUGINLIB_EXPORT_CLASS(my_custom_plugin::CustomRvizPlugin, rviz::Panel) ``` 完成后重新运行命令验证插件是否被正确注册至系统路径下[^3]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值