美文网首页
使用c++ cmake 调用gtkmm3接口实现一个提醒窗口

使用c++ cmake 调用gtkmm3接口实现一个提醒窗口

作者: 不l明l白 | 来源:发表于2024-05-15 11:13 被阅读0次

    使用c++ cmake 调用gtkmm3接口实现一个提醒窗口

    接上一篇文章, 发现gtk与c++相性不好, 比如如果想要实现一个类, 在类中创建窗口, 则在绑定信号的时候, 类的成员函数需要设置为静态函数才行, 用起来比较别扭.

    后面发现可以使用gtkmm来实现, 最大的问题是gtkmm3的文档网上找不到, 所以又专门从gtkmm-doc仓库编译了gtkmm3.24版本的的html版本的文档. 文档链接: https://github.com/skkily/gtkmm-3.24-document

    效果展示

    image.png

    新增了btn1倒计时功能, 到时则表示选择该按钮.

    布局上固定了label和按钮的大小, 不会随着窗口大小变化, 且始终居中.

    编译运行

    环境配置:

    apt update && apt install libgtkmm-3.0-dev g++ cmake

    编译方式:

    cmake && make

    运行:

    ./gtk-test

    源码

    gtkmm_alert.cpp

    #include "gtkmm_alert.h"
    #include <iostream>
    
    GtkmmAlert::GtkmmAlert(std::string msg, std::string btn1, std::string btn2, int count_time) : 
                                _button01(btn1 + "[" + std::to_string(count_time) + "]"),
                                _count(count_time),
                                _btn1_text(btn1),
                                _button02(btn2),
                                _text(msg)
    {
        set_title("Alert");
        set_border_width(8);
        //set_default_size(500, 250);   //主窗口的默认大小
    
        //grid作为最底层的布局, 提供屏幕居中功能
        add(_grid);
    
        //vbox夹在两个空白控件中间, 空白控件自由拓展, 就把vbox居中了
        _vbox.set_size_request(400, 150);
        //_vbox.override_background_color(Gdk::RGBA("#efedec")); //设置vbox背景颜色
        _vbox.set_halign(Gtk::Align::ALIGN_END);
        _vbox.set_valign(Gtk::Align::ALIGN_CENTER);
        _blank1.set_hexpand(true);
        _blank2.set_hexpand(true);
        _hhbox.add(_blank1);
        _hhbox.add(_vbox);
        _hhbox.add(_blank2);
        _grid.attach(_hhbox, 0, 0, 1, 1);
    
        //vbox设置为垂直布局, 后续与上一篇是一个思路
        _vbox.set_orientation(Gtk::ORIENTATION_VERTICAL);
    
        _text.set_vexpand(true);
        _vbox.pack_start(_text);
    
        _button01.signal_clicked().connect(sigc::mem_fun(*this, &GtkmmAlert::button01_clicked));
        _button02.signal_clicked().connect(sigc::mem_fun(*this, &GtkmmAlert::button02_clicked));
        _hbox.pack_start(_button01);
        _hbox.pack_start(_button02);
    
        _vbox.pack_start(_hbox, Gtk::PACK_SHRINK, 1);
    
        show_all();
        
        //倒计时功能, 使用glib提供的timeout信号实现
        Glib::signal_timeout().connect(sigc::mem_fun(*this, &GtkmmAlert::update_text), 1000);
    }
    
    void GtkmmAlert::button01_clicked()
    {
        std::cout << "select btn1" << std::endl;
        close();
    }
    
    void GtkmmAlert::button02_clicked()
    {
        std::cout << "select btn2" << std::endl;
        close();
    }
    
    bool GtkmmAlert::update_text()
    {
        if(_count == 0)
        {
            std::cout << "select btn1" << std::endl;
            close();
        }
        _count--;
        _button01.set_label(_btn1_text + "[" + std::to_string(_count) + "]");
        //再次设置倒计时信号
        Glib::signal_timeout().connect(sigc::mem_fun(*this, &GtkmmAlert::update_text), 1000);
        return false;
    }
    

    main.cpp

    #include "gtkmm_alert.h"
    int main(int argc, char **argv)
    {
        auto app = Gtk::Application::create("org.gtkmm.alert");
    
        GtkmmAlert gtk_alert("label", "btn1", "btn2", 10);
        
        app->run(gtk_alert);
    
        return 0;
    }
    
    

    gtkmm_alert.h

    #ifndef GTKMM_ALERT_H
    #define GTKMM_ALERT_H
    
    #include <gtkmm.h>
    #include <gtkmm/button.h>
    #include <gtkmm/window.h>
    #include <gtkmm/box.h>
    
    class GtkmmAlert : public Gtk::Window
    {
    public:
        GtkmmAlert(std::string msg, std::string btn1, std::string btn2, int count_time);
    
    protected:
        void button01_clicked();
        void button02_clicked();
        bool update_text();
        Gtk::Button _button01, _button02;
        Gtk::Label _text, _blank1, _blank2;
        Gtk::Box _vbox, _hbox, _hhbox;
        Gtk::Grid _grid;
        int _count;
        std::string _btn1_text;
    };
    
    #endif
    

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.0.0)
    project(gtk_test VERSION 0.5.0 LANGUAGES C CXX)
    
    add_executable (gtk-test main.cpp gtkmm_alert.cpp)
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(GTKMM gtkmm-3.0)
    link_directories(
        ${GTKMM_LIBRARY_DIRS}  )
    include_directories(
        ${GTKMM_INCLUDE_DIRS}  )
    target_link_libraries(gtk-test 
        ${GTKMM_LIBRARIES}  )
    

    相关文章

      网友评论

          本文标题:使用c++ cmake 调用gtkmm3接口实现一个提醒窗口

          本文链接:https://www.haomeiwen.com/subject/rcvvfjtx.html