zoukankan      html  css  js  c++  java
  • Qt开发经验小技巧146-150

    1. Qt中自带的很多控件,其实都是由一堆基础控件(QLabel、QPushButton等)组成的,比如日历面板 QCalendarWidget 就是 QToolButton+QSpinBox+QTableView 等组成,妙用 findChildren 可以拿到父类对应的子控件集合,可以直接对封装的控件中的子控件进行样式的设置,其他参数的设置比如设置中文文本(默认可能是英文)等。
    //打印子类类名集合
    void printObjectChild(const QObject *obj, int spaceCount)
    {
        qDebug() << QString("%1%2 : %3")
                 .arg("", spaceCount)
                 .arg(obj->metaObject()->className())
                 .arg(obj->objectName());
    
        QObjectList childs = obj->children();
        foreach (QObject *child, childs) {
            printObjectChild(child, spaceCount + 2);
        }
    }
    
    //拿到对话框进行设置和美化
    QFileDialog *fileDialog = new QFileDialog(this);
    fileDialog->setOption(QFileDialog::DontUseNativeDialog, true);
    QLabel *lookinLabel = fileDialog->findChild<QLabel*>("lookInLabel");
    lookinLabel->setText(QString::fromLocal8Bit("文件目录:"));
    lookinLabel->setStyleSheet("color:red;");
    
    //设置日期框默认值为空
    QLineEdit *edit = ui->dateEdit->findChild<QLineEdit *>("qt_spinbox_lineedit");
    if (!edit->text().isEmpty()) {
        edit->clear();
    }
    
    1. Qt内置了各种对话框,比如文件对话框-QFileDialog ,颜色对话框-QColorDialog ,默认都会采用系统的对话框风格样式,这样可以保持和系统一致,如果不需要的话可以取消该特性,取消以后会采用Qt自身的对话框,这样才能进行美化和其他处理。
    QFileDialog *fileDialog = new QFileDialog(this);
    //不设置此属性根本查找不到任何子元素,因为默认采用的系统对话框
    fileDialog->setOption(QFileDialog::DontUseNativeDialog, true);
    qDebug() << fileDialog->findChildren<QLabel *>();
    //打印输出 QLabel(0x17e2ff68, name="lookInLabel"), QLabel(0x17e35f88, name="fileNameLabel"), QLabel(0x17e35e68, name="fileTypeLabel")
    
    1. QtCreator集成开发环境,也内置了对快速添加注释的支持,比如最常用的在头文件开头添加一大段通用模板的注释,标注文件创建者、时间等信息。
    • 菜单->工具->选项->文本编辑器->右侧tab页面片段(snippets);
    • 组选择C++, 可以看到这里面已经内置了不少定义比如foreach,可以依葫芦画瓢;
    • 添加一个片段, 比如名字是fun, 触发种类是这个片段的简单描述;
    • 当我们在代码文件中键入fun时, 会自动弹出智能提醒, 选择我们的代码片段回车, 自动填充代码;
    • 按tab可以在变量间切换, 输入完成后回车, 完成编辑;
    /**
      * @brief $name$
      * @param $param$
      * @author feiyangqingyun
      * @date $date$
      */
    $ret$ $name$($param$)
    {
        $$
    }
    
    1. Qt5时代对信号槽运行机制据说有了很大的改进。
    • 在Qt5之前,connect一般都只能这么写connect(sender, SIGNAL(signalFunc()), receiver, SLOT(receiveFunc())),就是说在connect的时候,必须把信号用宏SIGNAL包裹起来,把槽函数用宏SLOT包裹起来,这样才能被Qt的Moc机制识别;
    • 在编译的时候即使信号或槽不存在或者参数不正确也不会报错,但是在执行的时候无效,会打印提示,对于C++这种静态语言来说,这是不友好的,不利于调试;
    • 但是Qt5之后更加推荐"取地址的写法",采用这种写法,如果编译的时候信号或槽不存在是无法编译通过的,相当于编译时检查,不容易出错;
    • 如果没有历史遗留问题需要兼容Qt4还是推荐用新写法,有类型检查更严格,而且支持的写法多样非常灵活;
    • 一些简单的处理逻辑强烈推荐直接lambda表达式直接处理完;
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public: MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
    
    private:
        void test_fun();
    
    private slots:
        void test_slot();
    };
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        //早期写法,通用Qt所有版本,只支持定义了slots关键字的函数
        //connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(test_fun()));
        connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(test_slot()));
        //新写法,支持Qt5及后期所有版本,支持所有函数,无需定义slots关键字也行
        connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::test_fun);
        connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::test_slot);
        //另类写法,支持lambda表达式,直接执行代码
        connect(ui->pushButton, &QPushButton::clicked, [this] {test_fun();});
        connect(ui->pushButton, &QPushButton::clicked, [this] {
            qDebug() << "hello lambda";
        });
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::test_fun()
    {
        qDebug() << "test_fun";
    }
    
    void MainWindow::test_slot()
    {
        qDebug() << "test_slot";
    }
    
    1. Qt样式表有多种运行机制,主要是考虑到各种需求场景,继承自QWidget的类和qApp类都支持setStyleSheet方法,还可以统一将样式表放在文件,或者将样式文件加入到资源文件。
    • 斗气:qss内容写得到处都是,哪里需要就写在哪里,各种控件调用 setStyleSheet方法传入样式表内容,或者直接对应控件鼠标右键弹出菜单选择改变样式表填入内容;
    • 斗者:qss内容放在文件,读取文件内容设置样式表,程序发布的时候带上qss文件;
    • 斗师:qss文件作为资源文件放到qrc文件,直接编译到可执行文件中,防止篡改;
    • 斗灵:在qss文件中自定义一些标志充当变量使用,读取以后替换对应的变量为颜色值,类似动态换肤;
    • 斗王:放在文件容易被篡改,集成到可执行文件不够灵活,一旦样式表更新需要重新编译文件,如何做到既能只更新样式表文件,又不需要重新编译可执行文件,又能防止被篡改,采用rcc命令将资源文件编译生成二进制,只需要替换该二进制文件即可;
    • 斗皇:继承qstyle类自己实现完成所有样式接口,统一整体风格,大名鼎鼎的UOS系统默认规则就是如此,不允许用样式表,全部painter绘制;

    Qt开发经验开源主页(持续更新):

    1. https://gitee.com/feiyangqingyun/qtkaifajingyan
    2. https://github.com/feiyangqingyun/qtkaifajingyan
  • 相关阅读:
    多个网站域名使用同一个IP的设置
    Delphi 文本文件操作
    iframe 元素
    ssis 配置 sqlserver 作业
    关闭占用端口号的进程
    如果你知道要往哪里去,全世界都会给你让路
    不再消极,不再忧虑
    bat 拷贝文件并记录日志
    添加 aspnet 账户到共享文件夹
    截止2013年5月,.net 所有技术路线的一个概括
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/14696240.html
Copyright © 2011-2022 走看看