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-基础控件 的相关文章

  • 右键单击 QPushButton 上的 contextMenu

    对于我的应用程序 我在 Qt Designer 中创建了一个 GUI 并将其转换为 python 2 6 代码 关于一些QPushButton 与设计器创建 我想添加右键单击上下文菜单 菜单选项取决于应用程序状态 如何实现这样的上下文菜单
  • 如何通过 Qt 创建网络服务 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何从浮点数组创建新的 QImage

    我有一个代表图像的浮点数数组 列在前 我想在 QGraphicsSecene 上将图像显示为 QPixmap 为了做到这一点 我尝试使用 QImage 构造函数 QImage const uchar data int width int h
  • 如何为 qmlRegisterSingletonType 实现单例提供程序?

    我想在 QML 中使用 C 类作为 Singleton 实例 并认为我必须使用 qmlRegisterSingletonType 注册它们 此函数需要一个提供已注册 C 类的实例的函数 我在 Windows 上使用最新的 Qt 5 3 1
  • 使用 QTextCursor 选择一段文本

    使用 Qt 框架选择文本片段时遇到问题 例如 如果我有这个文件 没有时间休息 我想选择 ime for r 并从文档中删除这段文本 我应该如何使用 QTextCursor 来做到这一点 这是我的代码 QTextCursor cursor n
  • 仅在内部/外部抚摸路径?

    Given a QPainterPath http qt project org doc qt 4 8 qpainterpath html如何仅在路径的内侧或外侧边缘 或非闭合路径的左侧或右侧 描边路径 QPainter strokePat
  • Qt qDebug() 在 Windows shell 中不起作用

    我正在使用一个qDebug Qt 框架的printf屏幕上有东西 当我从 Qt Creator 运行应用程序时它工作得很好 但是当我尝试从 Windows 执行它时cmd它什么也没显示 为什么会发生这种情况 你必须添加 CONFIG con
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • QT:删除QGridLayout中QLabel之间的空格

    我将一些具有不同颜色的 QLabels 添加到 QGridLayout 作为 QWidget 的布局 现在我在每个 Qlabel 与下一个 Qlabel 之间有一个间距 我想将其删除 我尝试将标签的边距设置为 0 将 GridLayout
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • Retina 显示屏中具有 QOpenGLWIdget 的 Qt MainWindow 显示错误大小

    我有一个 Qt 应用程序MainWindow 我嵌入一个QOpenGLWidget在里面 一切正常 直到我开始使用 Apple Retina 显示屏并在高 DPI 模式下运行我的应用程序 我的QOpenGLWidget只是它应该具有的大小的
  • C++ SQL 查询构建库

    我正在寻找一个提供与 c SelectQueryBuilder 库类似功能的 c 库 http www codeproject com Articles 13419 SelectQueryBuilder Building complex a
  • 如何去除QWizard中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我尝试递归浏览所有小部件并将其边框设置为无 但似乎没有任何小部件具有此边框 这是我的代码 可以找到完整的可构建示例here https gist github com ardeid
  • QML 中可重用的字体属性[重复]

    这个问题在这里已经有答案了 在 QML 中 我希望能够定义一组字体属性以进行简单的语义重用 例如 代替 Text text This is a header font family Encode Sans weight Font Black
  • Qt中用于线程间通信的类设计

    问题陈述 用相机跟踪物体并相应地移动相机的方位角和仰角 Process 相机获取物体的图像 处理相机的每一帧以查找物体 应该被跟踪 并将每帧中生成的信息传递给机械设备 万向节 以平移和倾斜方式移动摄像机 Design 主 Gui 在一个线程
  • 覆盖 QWebView 中的页面回复

    我试图在 Qt 的 QWebView 中拦截页面 表单请求 并在某些情况下使用替代内容进行响应 QNetworkReply ngcBrowser createRequest Operation operation const QNetwor
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • 无法运行 Qt 应用程序:找不到版本“Qt_5”

    我运行 Ubuntu 16 04 LTS 我的问题是我无法运行可以编译的 Qt5 应用程序 这是我尝试运行它时得到的结果 home user Desktop sconfig dist Release GNU Linux SCongif us
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目

随机推荐

  • 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 三态按钮的实现 实现目标 按钮的三种状态 按下 释放 进入 切换不同的相似图片