Qt6学习笔记

QT6作为一款看上去还挺漂亮的前端框架,实在是出门旅行居家必备之良品。

本Ghost也不能免俗,于是来和大家一起学习一下这玩意到底有何奥秘。

1

main window的三种基类: QMainWindow有toolbar QWidget和QDialog是没有toolbar的

2

cpp的explicit标识符,如果写了,就表示这个类是explicit的,否则就叫一个implicit类,对于一个implicit类,如果他的构造函数只有一个参数,那么可以把这个类的类名用类似强制类型转换的方式使用,比如:

class Foo {
    private:
        int m_foo;

    public:
        Foo(int foo): m_foo(foo) {} //这里的冒号标识符是用来initialization的。有两种用法,一是用来直接调用父类的构造函数,二是用来初始化某些值的,这里等效于m_foo = foo;,作用是在构造函数运行之前就执行这个赋值语句。如果被赋值的变量m_foo是const int m_foo;,那么在构造函数体里面不能直接给它赋值,而用这种冒号的赋值语句是可行的。如果要调用多个父函数的构造函数,或者要给多变量赋值,那多个冒号表达式用逗号隔开

        int GetFoo() { return m_foo; }
}

3

QT的stylesheet可以用类似css的方法自定义widget的样式,比如定义所有的QPushButton的背景颜色为黄色:

QPushButton{
    background yellow;
}

注意如果选择更改了主窗口的样式,那主窗口下所有的按钮都会改变,因为这些窗口都是主窗口的后代widget,如果想仅改变其中一个widget的样式,可以用QPushButton#button_no_1这样的id选择器来选择特定widget,或者直接对widget本身的样式进行修订

4

如果在qt的design界面更改了控件的名字,则需要先构建一次才能在编辑窗口使用代码补全

5

cpp的标准模板库的vector,使用方法是:

std::vector<type> variable_name = {value1, value2};

比如我要用一个vector装载radiobox_{1..3}的指针,就可以

std::vector<QRadioBox *> radio_boxes = {radiobox_1, radiobox_2, radiobox_3};

之后用一个循环变量去便利vector里面的所有内容,就可以

for (QRadioBox * i: radio_boxes){
    do_something();
}

另外QT中还自己有一个QStringList,定义方法与vector相近:

QStringList items = {"d", "e", "f"};

循环也可以用foreach:

foreach (QString item, items) {
    do_something();
}

6

QT中有不同的message boxes可供提示使用,它们在QMessageBox命名空间下边,分别是

QMessageBox::information
QMessageBox::warning
QMessageBox::about
QMessageBox::question

使用的时候,以question box为例,它的第一个参数是父窗口的指针,第二个是标题字符串,第三个是信息字符串,如果是question box的话,还有第四个参数,一般设置为QMessageBox::Yes|QMessageBox::No,前者是16384(2^14,即第15位有一个1),后者是65536(2^16,即第17位有一个1),两者进行bit-wise或得到的一个bitmap,即

QMessageBox::question(this, "Title of the question box", "Do you answer yes or no?", QMessageBox::Yes|QMessageBox::No);

question box的回复,是一个QMessageBox::StandardButton的值,比如说我可以这样获取question box的回复:

QMessageBox::StandardButton reply;
reply = QMessageBox question(this, "Title", "Question", QMessageBox::Yes|QMessageBox::No);

if (reply == QMessageBox::Yes) {
    do_something_for_answering_yes();
} else if (reply == QMessageBox::No) {
    do_smething_for_answering_no();
}

7

创建项目的时候记得要用qmake来构建整个项目,而不要用cmake,否则会无法添加resource文件

8

设置textEdit的字体

bool ok
Qfont font = QFontDialog::getFont(&ok, QFont("Times New Roman", 12), this);
if (ok) {
    ui->textEdit->setFont(font);
}

这会更改整个textedit的文字字体,无论有没有选中文本

下面一段代码可以更改选中部分的文字字体:

    bool ok;
    QFont font = QFontDialog::getFont(&ok, QFont("Helvetica[Cronyx]", 12), this);

    QTextCharFormat format;
    format.setFont(font);
    if (ok) {
        ui->textEdit->textCursor().setCharFormat(format);
    }

设置textColor

bool ok
QColor color = QColorDialog::getColor(QT::yellow, this);
ui->textEdit->setTextColor(color);

这个只会更改选中部分的文字颜色

设置打印对话框

QPrinter printer;
QPrintDialog dialog(&printer, this);
dialog.setWindowTitle("Print Document");

if (ui->textEdit->textCursor().hasSelection()) {
    dialog.setOption(QAbstractPrintDialog::PrintSelection);
}

if (dialog.exec() != QDialog::Accepted) {
    return;
}

Written by Zhang, Zijian in 但求日新 on 五 23 十二月 2022.

Comments

comments powered by Disqus