QT-基础控件

2023-11-11

目录

1-三态按钮的实现

2-普通按钮的下拉框

3-复选框

4-单选按钮

5- 工具栏按钮

6-文本标签

7-编辑框

8-进度条

9-组合框

10-按钮对话框


1-三态按钮的实现

实现目标:按钮的三种状态(按下-释放-进入)切换不同的相似图片达到良好的交互效果

实现思路:继承按钮类重写响应事件

 实现继承按钮类如下

 

#include <QWidget>
#include <QPushButton>
class XButton : public QPushButton
{
    Q_OBJECT
public:
    XButton(QWidget *p=nullptr);
    void mousePressEvent(QMouseEvent *e);  //处理按下事件
    void mouseReleaseEvent(QMouseEvent *e);//处理释放事件
    bool event(QEvent *e);                 //处理鼠标进入按钮事件
    //

    void setImage(QList<QIcon>& icons);//接受图片方法
private:
    QList<QIcon> _icons;//储存图片路径集合
};
-------------------以上是头文件-----以下是源文件实现-------------------
#include "xbutton.h"
#include <QEvent>
#include <QMessageBox>
XButton::XButton(QWidget *p):QPushButton(p)
{

}

void XButton::mousePressEvent(QMouseEvent *e)
{
    setIcon(_icons[2]);
    QPushButton::mousePressEvent(e);//交给父类 继续执行按钮的其他 事件。不调用可能导致父类功能缺失
}

void XButton::mouseReleaseEvent(QMouseEvent *e)
{
    setIcon(_icons[0]);
    QPushButton::mouseReleaseEvent(e);//交给父类 继续执行按钮的其他 事件。不调用可能导致父类功能缺失
}

bool XButton::event(QEvent *e)
{
    if(e->type()==QEvent::HoverEnter)//进来 入
    {
        setIcon(_icons[1]);
    }else if(e->type()==QEvent::HoverLeave){//离开 出
        setIcon(_icons[0]);
    }
    return QPushButton::event(e); //交给父类 继续执行按钮的其他 事件。不调用可能导致父类功能缺失
}

void XButton::setImage(QList<QIcon> &icons)
{
    //Q_ASSERT(icons.size()==3);//断言
    if(icons.size()!=3&& QMessageBox::question(this,"图片缺失3","检查图片参数是否3张,按钮暂不可用")
            ==(QMessageBox::Yes|QMessageBox::No))
    {
        //如果图片小于三警告终止程序,但是图片一般是自己放置完整故不作限制操作
    }
    else{
        _icons=icons;
        setIcon(_icons[0]);
    }
}

main函数中运行如下

#include "widget.h"
#include <QApplication>
#include <QDebug>
#include "xbutton.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.move(200,50);
    w.resize(1600,800);
    w.show();

    XButton *but_santai=new XButton(&w);
    but_santai->setGeometry(0,240,200,60);
    QList<QIcon> icons;
    icons<<QIcon("mao.jpg")<<QIcon("mao1.jpg")<<QIcon("mao2.jpg");
    but_santai->setVisible(true);
    but_santai->setImage(icons);
    QObject::connect(but_santai,&XButton::clicked,[](){
        qDebug()<<"but_santai";
    });
}

 

2-普通按钮的下拉框

其实不推荐这样写下拉框,后面学习才知道,本身按钮的下拉框适应就不是很好,不如用combox,就当学习了,一通万物通.

实现思路:1-创建一个菜单   2-创建一定数量的菜单项   (菜单项设置进菜单  菜单设置进按钮)

#include "widget.h"
#include <QApplication>
#include <QDebug>
#include <QPushButton>
#include <QMenu>
#include <QAction>
int main(int argc, char *argv[])
{
    QMenu* menu=new QMenu(&w);    //创建 菜单
    QAction* action=new QAction();//创建 菜单项
    action->setText("第一个菜单项");
    action->setIcon(QIcon("mao.jpg"));
    action->setCheckable(true);
    menu->addAction(action);

    QAction* action1=new QAction();//创建 菜单项
    action1->setText("第2个菜单项");
    action1->setIcon(QIcon("mao1.jpg"));
    menu->addAction(action1);

    QAction* action2=new QAction();//创建 菜单项
    action2->setText("第3个菜单项");
    action2->setIcon(QIcon("mao2.jpg"));
    menu->addAction(action2);

    button1->setMenu(menu);//将菜单加入按钮

    QObject::connect(action,&QAction::triggered,[](bool check){ //信号槽 check为信号自带参数
        qDebug()<<"action:"<<check;
    });
    QObject::connect(action1,&QAction::triggered,[](bool check){
        qDebug()<<"action1:"<<check;
    });
    QObject::connect(action2,&QAction::triggered,[](bool check){
        qDebug()<<"action2:"<<check;
    });
}

 

3-复选框

以下全部实现都写成方法直接声明调用即可。

重点:主要看一下复选框的三种状态 :   未选中(空白)  半选中(方形填充)  全选中(对勾填充)

#include <QCheckBox>
#include <QDebug>
#include <QPushButton>
void init_(QWidget* w)
{
    QCheckBox* cBox1=new QCheckBox(QString("100"),w);
    cBox1->setGeometry(300,50,50,50);
    cBox1->setVisible(true);

    //cBox1->setTristate(true);//**打开 三种状态间0-1-2的切换

    QObject::connect(cBox1,&QCheckBox::clicked,[](bool check){
        qDebug()<<"clicked"<<check;
    });
    QObject::connect(cBox1,&QCheckBox::pressed,[](){
        qDebug()<<"pressed";
    });
    QObject::connect(cBox1,&QCheckBox::released,[](){
        qDebug()<<"released";
    });
    QObject::connect(cBox1,&QCheckBox::toggled,[](bool check){
        qDebug()<<"toggled"<<check;      //0是false 1和2都是true
    });
    QObject::connect(cBox1,&QCheckBox::stateChanged,[](int state){
        qDebug()<<"stateChanged"<<state; //0未选中状态  1部分选中状态  2全选中状态
    });

    //cBox1->setCheckState(Qt::PartiallyChecked);//半选中状态  setCheckState

}

 

4-单选按钮

主要关注单选按钮的互斥表现,在一定容器内只可以有一个为选中状态

#include <QRadioButton>
#include <QDebug>
#include <QPushButton>
#include <QButtonGroup>
void init_radiobutton(QWidget* w)
{
#if 0  //0代表这段被包起来的代码不会执行  1表示可以执行
    QRadioButton* r3=new QRadioButton(w);
    r3->move(500,20);
    r3->setText(QString("单选按钮1"));
    r3->setVisible(true);
    QRadioButton* r4=new QRadioButton(w);
    r4->move(500,40);
    r4->setText(QString("单选按钮2"));
    r4->setVisible(true);
    QButtonGroup* b_group=new QButtonGroup(w);//放入一个容器 展示
    b_group->addButton(r3);
    b_group->addButton(r4);
#endif

    QRadioButton* r1=new QRadioButton(w);
    r1->move(400,20);
    r1->setText(QString("单选按钮1"));
    r1->setVisible(true);
    QRadioButton* r2=new QRadioButton(w);
    r2->move(400,40);
    r2->setText(QString("单选按钮2"));
    r2->setVisible(true);
    QObject::connect(r1,&QRadioButton::clicked,[](bool check){ //每次点击都会触发
        qDebug()<<"r1 clicked"<<check;
    });
    QObject::connect(r1,&QRadioButton::toggled,[](bool check){ //只有点击不同单选按钮才会触发,感觉这个用处更大
        qDebug()<<"r1 toggled"<<check;
    });
    QObject::connect(r2,&QRadioButton::clicked,[](bool check){
        qDebug()<<"r2 clicked"<<check;
    });
    QObject::connect(r2,&QRadioButton::toggled,[](bool check){
        qDebug()<<"r2 toggled"<<check;
    });
    QPushButton* pushbutton=new QPushButton(w);
    pushbutton->move(400,60);
    pushbutton->setText("选中的单选按钮");
    pushbutton->setVisible(true);
    QObject::connect(pushbutton,&QPushButton::clicked,[=](){
        qDebug()<<r1->isChecked()<<"  "<<r2->isChecked();
    });
}

 

5- 工具栏按钮

感觉很舒服的按钮下拉效果对比之前极其丝滑

(一个小插曲,比如设置属性的时候 有的是set~开头 有的add~开头。开始我有点分不清什么时候set 什么时候 add  后来总结的时候恍然大悟只要单个设置的基本都是set 只有这个属性可以添加多个东西的时候是add 开头。虽然很简单但是当时一直没想通哈哈 ^猪头^ )

/*
* 思路:创建菜单  创建菜单项  创建工具栏按钮
*/
#include <QToolButton>
#include <QDebug>
#include <QMenu>
#include <QAction>
void ini_toolbutton(QWidget* w)
{
    //给工具栏按钮 设置一个菜单
    QMenu* menu=new QMenu(w);
    QAction* ac1=new QAction();
    ac1->setText("工具栏1");
    ac1->setIcon(QIcon("mao.jpg"));
    ac1->setCheckable(true);//其实这一句可以不写,他的效果会让选中的带上一个持续的状态
    menu->addAction(ac1);
    QAction* ac2=new QAction();
    ac2->setText("工具栏1");
    ac2->setIcon(QIcon("mao1.jpg"));
    ac2->setCheckable(true);
    menu->addAction(ac2);
    QObject::connect(ac1,&QAction::triggered,[](bool check){
        qDebug()<<"ac1-triggered"<<check;
    });
    QObject::connect(ac2,&QAction::triggered,[](bool check){
        qDebug()<<"ac2-triggered"<<check;
    });
    //工具栏按钮
    QToolButton* toolbtn=new QToolButton(w);
    toolbtn->move(400,200);
    toolbtn->resize(130,50);
    toolbtn->setText("工具栏按钮");

    //toolbtn->setIconSize(QSize(60,20));//图片设置大小
    //toolbtn->setIcon(QIcon("mao.jpg"));
    toolbtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);//图片文字样式
    toolbtn->setArrowType(Qt::LeftArrow);//设置箭头 可以看做是个图片也受setToolButtonStyle影响

    toolbtn->setCheckable(true);//增加可选中状态 会使得按钮保持被选中状态
    toolbtn->setVisible(true);
    QObject::connect(toolbtn,&QToolButton::clicked,[](bool check){
        qDebug()<<"toolbtn:"<<check;
    });

    toolbtn->setMenu(menu);//将菜单加入 工具栏按钮
    //toolbtn->setPopupMode(QToolButton::InstantPopup);//设置点击立即打开菜单 2
    toolbtn->setPopupMode(QToolButton::MenuButtonPopup);//设置点击箭头打开菜单 1 优先使用这个 优先使用这个  优先使用这个
    //toolbtn->setPopupMode(QToolButton::DelayedPopup);//设置长点击打开菜单 0
    //toolbtn->setDefaultAction(ac2);//设置 工具栏按钮 点击默认执行 哪一个菜单项 非要用尽量和 0 1 结合
}

 

6-文本标签

文本标签更多的时候不是显示文字,而是显示图片,还有gif动图  * - *

#include <QLabel>
#include <QDebug>
#include <QDesktopServices> //为了打开网址引入的头  也可以用label自带属性
#include <QUrl>             //为了打开网址引入的头  也可以用label自带属性
#include <QMovie>//显示动画
void ini_lable(QWidget* w)
{
    QLabel* lab1=new QLabel(w);
    //lab1->setText("普通文本标签测试\n换行");
    lab1->setText("<a href=\"https://hao.360.com/\">360网址<a/>");//HTML 超链接
    lab1->setAlignment(Qt::AlignHCenter);//水平对齐
    lab1->setGeometry(400,300,300,60);
    lab1->setVisible(true);

    lab1->setOpenExternalLinks(true);//可以直接打开网址 超链接不需要引入头文件可以替换下面的0代码
#if 0
    QObject::connect(lab1,&QLabel::linkHovered,[=](QString url){
        qDebug()<<url;
    });
    QObject::connect(lab1,&QLabel::linkActivated,[](QString url){ //点击超链接
        qDebug()<<url;
        QDesktopServices::openUrl(QUrl(url));//打开网址
    });
#endif
    //lable标签做图片
    QLabel* lab2=new QLabel(w);
    lab2->setPixmap(QPixmap("mao.jpg"));//放入图片
    lab2->setGeometry(400,450,200,200);
    lab2->setScaledContents(true);//将图片自动进行缩放 防止lable过小显示不下图片
    lab2->setVisible(true);
    //lable标签显示gif动图
    QLabel* lab3=new QLabel(w);
    lab3->setGeometry(200,450,180,180);
    QMovie* movie=new QMovie("gif.gif");//指针写法出了方法可以继续使用
    movie->setCacheMode(QMovie::CacheAll);//缓存流畅
    lab3->setMovie(movie);
    movie->start();//开始动画 一定要记得写
    lab3->setVisible(true);
}

 

7-编辑框

区区编辑框,内容很多,尤其是 校验 和 自动填充

/*
*    1-自动补全挺不错的一个功能
*    2-校验功能 尤其是正则表达式 太好用了,就是写一个表达式很漫长。
*/
#include <QLabel>
#include <QLineEdit>
#include <QDebug>
#include <QPushButton>
#include <QIntValidator>
#include <QDoubleValidator>
#include <QRegExpValidator>
#include <QCompleter>
#include <QStringListModel>
void ini_edit(QWidget *w)
{
    QLineEdit* edit=new QLineEdit(w);
    edit->setGeometry(600,50,200,50);
    //edit->setPlaceholderText("请输入密码");//占位符 提示用户输入信息
    edit->setVisible(true);
    //edit->setEchoMode(QLineEdit::Password);//输入显示模式
    //edit->setReadOnly(true);//只读属性
    //edit->setMaxLength(5);//字符最大长度

    //自动补全内容 4个步骤
    QStringList list;
    list<<"2022"<<"2023"<<"2024"<<"2025";//创建列表 步骤0
    list<<"3033"<<"3034"<<"a1111"<<"A1111";
    QStringListModel* stringModel=new QStringListModel();
    stringModel->setStringList(list);    //将列表放入list模型中 步骤1 (提供模型)
    QCompleter* completer=new QCompleter();
    //completer->setCompletionMode(QCompleter::PopupCompletion);//默认就是此模式可以不写
    completer->setFilterMode(Qt::MatchContains);//默认的字符位要对应也挺好用,改成这个属性更全面
    //①-②使用时 模型要是有序排列最好升|大小写敏感要统一否则设置的搜索模式无效
    //①-completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel);//改变搜索模式为二分法
    completer->setCaseSensitivity(Qt::CaseInsensitive);//②大小写不敏感
    completer->setModel(stringModel);    //将list模型放入completer中 步骤2 (根据模型完成更多的功能)
    edit->setCompleter(completer);       //设置到edit中 步骤3

    //手动补全:比如有的控件没有此功能
    completer->setCompletionPrefix("a");//根据字符前缀进行匹配 手动补全
    //如果想筛选出A a 大小写不敏感 要在completer->setModel();设置模型之前设置好,不然会导致前缀筛选无效
    int i=0;
    for(;completer->setCurrentRow(i);i++)//从第一行开始(将当前行设置为指定行) 设置成功返回true
    {
        qDebug()<<"i:"<<completer->currentCompletion() //返回前缀为a的内容 (大小写设置不敏感)
               <<"row:"<<completer->currentRow()       // 序号(当前行)
              <<"index:"<<completer->currentIndex().row()//模型中的行号
              <<"前缀数:"<<completer->completionCount();//前缀为a 或 A的总条数(大小写设置不敏感)
    }

#if 0
    //数据校验-壹
    //结合edit->hasAcceptableInput();符合规范返回true
    QIntValidator* intval=new QIntValidator();
    intval->setRange(2022,2099);//范围2022-2099  不可以阻止用户在界面输入规定之外的字符
    QDoubleValidator* doubleval=new QDoubleValidator();
    doubleval->setRange(3.00,3.99,2);//范围3-3.99 小数最多2位 不可以阻止用户在界面输入规定之外的字符
    QRegExpValidator* regval=new QRegExpValidator();
    QRegExp re("20((2[2-9])|([3-9][0-9]))");//正则表达式 可以阻止用户在界面输入规定之外的字符
    regval->setRegExp(re);                  //202[2-9] | 20[3-9][0-9]  范围2022-2099之间
    edit->setValidator(regval);
#endif
#if 0
    //数据校验-零
    //输入数字0-9
    //edit->setInputMask("000.000.000.000;_");//输入规则___.___.___.___分号后面只做占位
    ///permitted的这两个信号 editingFinished returnPressed 可以正常触发

    //输入16进制
    edit->setInputMask("HH.HH.HH.HH;_");//不加分号后面的占位默认是 空白
    ///required的这两个信号 editingFinished returnPressed 要在校验完毕后才会触发,不符合规则就不会触发
    //大写的H  required: 按_下滑键不会移动光标
    //edit->setInputMask("hh.hh.hh.hh;_");//不加分号后面的占位默认是 空白
    //小写的h  permitted: 按_下滑键可以移动光标

    //填充日期如下
    //edit->setInputMask("0000年00月00日;_");//除规定有意义字符,其他填充字符默认保留

    // > < !  的使用
    //edit->setInputMask(">AA<AA!AA;_");// >后面的转换为大写 <后面的转换为小写  !关闭转换

    //转义字符的特殊使用:第一个字母任意A-Z  第二个字符只能为 A
    //edit->setInputMask("A\\A");//   "\\"双反斜线才是setInputMask规定里的转义字符
    //c++: A\\A => A \ A
    //Qt:setInputMask: A \ A =>  A  \A
#endif
    //signal
    QObject::connect(edit,&QLineEdit::textChanged,[=](QString text){//输入和代码输入都会触发
        qDebug()<<"textChanged:"<<text;
    });
    QObject::connect(edit,&QLineEdit::textEdited,[=](QString text){ //输入就会触发
        qDebug()<<"textEdited:"<<text;
    });
    QObject::connect(edit,&QLineEdit::editingFinished,[=](){  //切换焦点就会触发
        qDebug()<<"editingFinished:"<<edit->text();
    });
    QObject::connect(edit,&QLineEdit::returnPressed,[=](){    //回车或return就会触发
        qDebug()<<"returnPressed:"<<edit->text();
    });


    QPushButton* btn=new QPushButton(w);
    btn->setGeometry(600,100,150,50);
    btn->setText(QString("检测edit"));
    btn->setVisible(true);
    QObject::connect(btn,&QPushButton::clicked,[=](){
        qDebug()<<edit->text()
               <<"是否符合规范"<<edit->hasAcceptableInput();//bool 输入的是否符合规范
    });
}

 

8-进度条

注意一下垂直-水平属性

#include <QDebug>
#include <QProgressBar>
void ini_progressBar(QWidget* w)
{
    QProgressBar* progressbar=new QProgressBar(w);
    progressbar->setGeometry(600,200,300,50);
    progressbar->setRange(0,100);
    //progressbar->setRange(0,0);//滚动动画 当不知道大小时可以先设置成这个
    progressbar->setValue(50);
    //progressbar->setFormat("百分比:%p% 总共的:%m");设置末端数字显示
    //progressbar->setOrientation(Qt::Vertical);//垂直方向(将不会显示文字信息)
    //progressbar->setInvertedAppearance(true);//进度条方向倒过来显示
    progressbar->setVisible(true);
}

 

9-组合框

关注他的信号和数据填充

 


#include <QDebug>
#include <QComboBox>
#include <QPushButton>
void ini_combobox(QWidget* w)
{
    //联动操作
    //思路1:一个主的 控制 两个副的visible显示 (这样可以自动保留用户上一次的选择项)
    //思路2:一个主的 控制 一个副的 选中不同的一级目录时给二级目录填充所需要的数据 (先清空后填充)
    QStringList subject;
    subject<<"c"<<"c++";
    QStringList subject_c;
    subject_c<<"c1"<<"c2"<<"c3";
    QStringList subject_cpp;
    subject_cpp<<"c++1"<<"c++2"<<"c++3";
    QComboBox* com1=new QComboBox(w);//一级控制
    com1->setGeometry(600,500,100,50);
    com1->addItems(subject);
    com1->setVisible(true);
    QComboBox* com1_1=new QComboBox(w);//二级控制
    com1_1->setGeometry(700,500,100,50);
    com1_1->addItems(subject_c);
    com1_1->setVisible(true);
    QComboBox* com1_2=new QComboBox(w);//二级控制
    com1_2->setGeometry(700,500,100,50);
    com1_2->addItems(subject_cpp);
    com1_2->setVisible(false);
    QList<QComboBox*> combox_list;//要放入指针类型为了方便统一处理,也可以单独操作
    combox_list<<com1_1<<com1_2;
    void (QComboBox::*com_int)(int)=&QComboBox::currentIndexChanged;
    QObject::connect(com1,com_int,[=](int index){
        /*if(index==0) //萌新用法 哈哈
        {
            combox_list[0]->setVisible(true);
            combox_list[1]->setVisible(false);
        }
        else if(index==1)
        {
            combox_list[0]->setVisible(false);
            combox_list[1]->setVisible(true);
        }*/
        int i=0;
        for(;i<subject.length();i++)//通过一个for循环去控制(如果数据量很大)
        {
            if(index!=i)
            {
                combox_list[i]->setVisible(false);//不是选中的都为false
            }
        }
        combox_list[index]->setVisible(true);//选中的设置为true
    });
#if 0
    QStringList text;
    text<<"a2022"<<"a2023"<<"a2024";
    QStringList icon;
    icon<<"mao.jpg"<<"mao1.jpg"<<"mao2.jpg";
    QList<int> data;
    data<<2022<<2023<<2024;
    QComboBox* combox=new QComboBox(w);
    int i=0;
    for(;i<text.length();i++)
    {
        combox->addItem(QIcon(icon[i]),text[i],QVariant(data[i]));//添加项
    }
    combox->setGeometry(600,300,100,50);
    //combox->setMaxVisibleItems(2);//最多显示几个,出现滚动条
    //combox->setIconSize(QSize(30,30));//设置图标大小
    //combox->setSizeAdjustPolicy(QComboBox::AdjustToContents);组合框大小策略一般不需要设置

    //signal 参数为int常用 应为常常文字信息只是方便人机交互不一定会数据处理
    void (QComboBox::*act_int)(int)=&QComboBox::activated;
    QObject::connect(combox,act_int,[=](int index){ //只要选中项就会触发
        qDebug()<<"act_int index:"<<index;
    });
    void (QComboBox::*act_string)(const QString& )=&QComboBox::activated;
    QObject::connect(combox,act_string,[=](const QString& string){
        qDebug()<<"act_int string:"<<string;
    });
    void (QComboBox::*curr_int)(int)=&QComboBox::currentIndexChanged;
    QObject::connect(combox,curr_int,[=](int index){ //选中不重复的项才会触发(两次选择同一个项不会触发)
        qDebug()<<"curr_int index:"<<index;
    });
    combox->setVisible(true);

    QPushButton* btn=new QPushButton(w);
    btn->setGeometry(600,400,80,40);
    btn->setText("组合框");
    btn->setVisible(true);
    QObject::connect(btn,&QPushButton::clicked,[=](){
        qDebug()<<combox->currentIndex()//选中的第几个
               <<combox->currentText()//显示的文本信息 方便用户阅读
              <<combox->currentData().toInt();//核心携带数据 (知道放入的携带数据是int直接转)
    });
#endif
}

10-按钮对话框

这个做了解就可 主要还是用它本身的 方便快捷(当然也可以自己添加按钮更优雅)

 

#include <QDebug>
#include <QDialogButtonBox>
#include <QPushButton>
void ini_dialog(QWidget* w)
{
    QDialogButtonBox* dialogbtn=new QDialogButtonBox(w);
    dialogbtn->addButton(QDialogButtonBox::Ok);//默认文字显示英文
    dialogbtn->addButton(QDialogButtonBox::Cancel);
    dialogbtn->addButton(QDialogButtonBox::Reset);
    dialogbtn->move(700,600);
    //dialogbtn->setOrientation(Qt::Vertical);//按钮垂直排列
    dialogbtn->setVisible(true);
#if 0 //添加按钮方式2
    QDialogButtonBox* dialogbtn=new QDialogButtonBox(w);
    dialogbtn->addButton("确定",QDialogButtonBox::AcceptRole);
    dialogbtn->addButton("取消",QDialogButtonBox::RejectRole);
    dialogbtn->addButton("重置",QDialogButtonBox::ResetRole);
    dialogbtn->move(700,600);
    //dialogbtn->setOrientation(Qt::Vertical);//按钮垂直排列
    dialogbtn->setVisible(true);
#endif
#if 0 //添加按钮方式1
    QPushButton* btn1=new QPushButton(w);
    btn1->setText("确定");
    QPushButton* btn2=new QPushButton(w);
    btn2->setText("取消");
    QPushButton* btn3=new QPushButton(w);
    btn3->setText("重置");
    QDialogButtonBox* dialogbtn=new QDialogButtonBox(w);
    dialogbtn->addButton(btn1,QDialogButtonBox::AcceptRole);
    dialogbtn->addButton(btn2,QDialogButtonBox::RejectRole);
    dialogbtn->addButton(btn3,QDialogButtonBox::ResetRole);
    dialogbtn->move(700,600);
    //dialogbtn->setOrientation(Qt::Vertical);//按钮垂直排列
    dialogbtn->setVisible(true);
#endif
    QObject::connect(dialogbtn,&QDialogButtonBox::accepted,[](){
        qDebug()<<"accepted";
    });
    QObject::connect(dialogbtn,&QDialogButtonBox::rejected,[](){
        qDebug()<<"rejected";
    });
    QObject::connect(dialogbtn,&QDialogButtonBox::clicked,[=](QAbstractButton *button){
        qDebug()<<"按钮:"<<button->text()<<"role:"<<dialogbtn->buttonRole(button);
    });
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT-基础控件 的相关文章

  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • Qt 文件对话框默认后缀不起作用

    我将以下代码用于 QtQuick Dialogs 1 3 和 Qt 5 10 0 下 filedialog 的新属性 我使用 Qt Creator 5 10 默认套件构建它 import QtQuick 2 10 import QtQuic
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • QToolButton:更改菜单位置

    使用菜单时QToolButton菜单显示在按钮的正下方 有没有办法在按钮的左侧 右侧显示菜单 我知道这个问题不久前已得到回答 但我想为此问题添加新答案 因为接受的答案不再有效 实际上 更改 QToolButton 上的菜单位置非常容易 您需
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • Qml 模块未找到 CPP 类注册与新的 QML_ELEMENT r

    我尝试使用 Qt5 15 0 和新宏 QML ELEMENT 在 QML 中注册我的自定义 CPP 类 但找不到该模块 Qt Creater 帮助文件描述了 QML ELEMENT 的步骤 我也检查了 Qt 手册 但没有幸福的结局 http
  • QT从QTableWidgetItem继承到Widget并覆盖'<'运算符

    我想要一个QTableWidget具有定制的某些单元QProgressBars 并且我希望能够对包含这些的列进行排序 我的定制QProgressBar继承自两者QProgressBar and QTableWidgetItem 并且我正在覆
  • 无法在带有 QSortFilterProxyModel 的 QTreeView 的点击信号中使用 itemFromIndex

    我有一个 QTreeView 在视图和 QStandardItemModel 之间有一个 QSortFilterProxyModel 来对树进行排序 然后我想通过 clicked 信号对视图中的点击进行操作 模型 视图的设置类似于 mymo
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • Qt - 获取互联网上托管的网页的源代码(HTML 代码)

    我想获取网页的源代码 HTML 例如StackOverflow的主页 这是我到目前为止编写的代码 QNetworkAccessManager manager QNetworkReply response manager get QNetwo
  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk
  • QWidget::showMinimized() 不起作用

    在 Ubuntu 13 04 上 如果使用QWidget showMinimized 为了最小化窗口 我发现通过单击系统任务栏上的应用程序图标恢复它后 调用QWidget showMinimized 无法工作 connect minimum
  • QFileInfo::isWritable() 在 Windows 7 上具有完全权限时返回 false

    QFile file filePath QFileInfo fileInfo file file open QIODevice ReadWrite or WriteOnly if fileInfo isWritable Log error
  • Qt 图表和数据可视化小部件

    我已经安装了 Qt 5 7 来尝试 Qt 图表和 Qt 数据可视化 但我在 Qt Designer 和 Qt Creator 中都找不到新的小部件 有什么建议我应该做什么才能让新的小部件出现在设计器中 我今天遇到了完全相同的问题 默认情况下
  • wkhtmltopdf 修补了 qt 吗?

    我正在尝试将多个 URL 转换为 PDF 但是 当我编译 wkhtmltopdf 或运行时apt get install wkhtmltopdf并尝试一下 它说 错误 此版本的 wkhtmltopdf 是针对未修补的 QT 版本构建的 并且
  • 如何在 Qt simple 上解密/加密某些字符串(例如密码)

    这是我得到的 Qt SDK版本4 6 2 视窗XP 问题 我怎样才能简单地加密和简单地加密QString价值 我需要它能够将一些加密的字符串保存到 INI 文件中 并在重新打开应用程序后将字符串加密为正常的密码字符串值 PS 我正在寻找简单

随机推荐

  • react+ts+echarts5.x按需导入实现世界地图

    registerMap注册世界地图 1 获取世界地图geoJSON格式的文件 获取地图的渠道 这个步骤很重要 本人找了很久都没找到世界地图的GeoJSON文件 这个网址可以提供 并且也提供了各个国家的GeoJSON a 根据 在线实例 确定
  • 前端js采坑,一个函数中同时有多个ajax()异步请求

    在近期的项目中 问题 多个异步请求执行时 有两个请求的路径是相同的 导致结果只执行当中的一个异步请求 add function vm showList false vm title 新增 vm role deptName null dept
  • 微服务架构-Day7

    学习目标 学会微服务架构 对应项目hotel demo 学习笔记 1 数据聚合 聚合 aggregations 可以让我们极其方便的实现对数据的统计 分析 运算 实现这些统计功能的比数据库的sql要方便的多 而且查询速度非常快 可以实现近实
  • display设为inline-block时引发的高度问题,大坑

    今天在写小程序 点击让这个遮罩层显示 结果一直下移 莫名其妙 解决方案 在元素的CSS中添加 vertical align bottom
  • SQL-使用视图

    什么是视图 它们怎样工作 何时使用它们 如何利用视图简化执行的某些SQL操作 1 使用视图的原因 A 重用SQL语句 B 简化复杂的SQL操作 在编写查询后 可以方便地重用它而不必知道其基本查询 C 使用表的一部分而不是整个表 D 保护数据
  • 【Python】科学计算库Scipy简易入门

    0 导语 Scipy是一个用于数学 科学 工程领域的常用软件包 可以处理插值 积分 优化 图像处理 常微分方程数值解的求解 信号处理等问题 它用于有效计算Numpy矩阵 使Numpy和Scipy协同工作 高效解决问题 Scipy是由针对特定
  • vue-组件按需加载

    组件按需加载 路由配置 path name component gt import views vue 按需加载 在vue中配置路由时 可以在头部先引入组件 然后下面定义路由时 在指向到具体使用的组件 这种是页面运行时 组件全部加载 占内存
  • 严重: 子容器启动失败 java.util.concurrent.ExecutionException 信息: 正在摧毁协议处理器 ["http-nio-80"]WARNING: An illegal

    话不多说直接上错误 解决方案 由于一开始以为是tomcat和eclipseEE出现故障 将两个软件重新下载并配置环境但错误没有解决 然后又检查了JDK版本也没问题 最后肯定了是代码的问题 仔细检查后发现是servlet映射地址写重了 后来又
  • HAL库的RCC简介

    一 RCC的时钟树总览 时钟输入源有四个 选择器 预 分频器和倍频器 最终设置的频率 SYSCLK系统时钟 SYSCLK可以有三种方式得到 1 HSI内部高速时钟用的是RC振荡器 频率为8M 精度不高 没有经过分频器和倍频器 这种方式得到的
  • 空utf8文件占三字节的问题(Java空文本文件FileInputStream读取问题)

    1 文件创建情况 2 程序代码 public class Demo01 public static void main String args throws IOException File file new File a txt long
  • pycharm mysql 安装_pycharm安装mysql驱动包

    新的环境配置pycharm的项目时 发现pycharm不能连接到mysql数据库 由于安了java环境但是还没配置相关的库 并且jetbrains家的IDE一般都是java写的 于是猜想可能是java缺少mysql的驱动 1 先确保pyth
  • c++学习:2.变量声明和定义的关系

    为了支持分离式编译 c 语言将声明和定义区分开来 声明只有名字并无实体 定义创建于声明名字相关的实体 因此声明和定义最重要的区别 声明不申请存储空间 定义申请存储空间 变量能且只能被定义一次 但是可以被多次声明 注意这里说的变量定义和变量赋
  • Pytorch 自己搭建的一个神经网络

    目录 数据集 dogs Vs Cats import time import torch nn as nn import torch optim from torch autograd import Variable from torch
  • 数学建模之圈养湖羊的空间利用率

    数学建模之圈养湖羊的空间利用率 D题最新最全思路已出 欢迎后台私信咨询 1 问题 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养 适应不同种类 不同阶段的牲畜对空间的不同要求 以保障牲畜安全和健康 与此同时 也要尽量减少空间闲置所造
  • 使用 Redis 统计在线用户人数

    在构建应用的时候 我们经常需要对用户的一举一动进行记录 而其中一个比较重要的操作 就是对在线的用户进行记录 本文将介绍四种使用 Redis 对在线用户进行记录的方案 这些方案虽然都可以对在线用户的数量进行统计 但每个方案都有一些自己特有的操
  • QT 学习笔记(十)

    文章目录 一 绘图 1 理论知识储备 2 画背景图 3 简单绘图 4 手动刷新窗口 二 绘图实现代码 1 主窗口头文件 widget h 2 主窗口头文件 widget cpp 由于每次代码都是在原有程序上修改 因此除了新建项目 不然一般会
  • java.net.BindException: Address already in use: bind

    报这个错误说明程序的端口被占用了 在windows server服务器下可以采取如下解决方案 查看日志报错 java net BindException Address already in use bind 查看程序使用的端口 发现por
  • seata多版本下载地址以及docker安装docker

    seata多版本下载地址https sourceforge net projects seata mirror docker安装seata youngyajun 博客园1 官方指南 地址 SEATA官方部署指南 可以根据自己情况配置安装 下
  • Mybatis一对多查询无法返回数组形式的整合信息

    在进行Mybatis一对多查询练习的时候 发现控制台打印的返回值只有一条数据 并没有想要的整合的数据形式 通过查找问题所在 发现问题原来是因为在配置
  • QT-基础控件

    目录 1 三态按钮的实现 2 普通按钮的下拉框 3 复选框 4 单选按钮 5 工具栏按钮 6 文本标签 7 编辑框 8 进度条 9 组合框 10 按钮对话框 1 三态按钮的实现 实现目标 按钮的三种状态 按下 释放 进入 切换不同的相似图片