Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 建议我如何使用预定义的颜色创建这样的颜色选择器_C++_Qt_User Interface_Widget_Qt Creator - Fatal编程技术网

C++ 建议我如何使用预定义的颜色创建这样的颜色选择器

C++ 建议我如何使用预定义的颜色创建这样的颜色选择器,c++,qt,user-interface,widget,qt-creator,C++,Qt,User Interface,Widget,Qt Creator,我是新来的。如何创建这样的颜色选择器控件?我需要把它放在另一个小部件或对话框上。所选颜色应为白色矩形或以另一种方式区分 我需要使用哪些控件来创建这样的小部件 您可以使用QtColorPicker :QtColorPicker类提供了一个小部件,用于从弹出的颜色网格中选择颜色 用户可以通过单击颜色选择器,或导航到它并按空格键来调用它。他们可以使用鼠标键或箭头键在网格上的颜色之间导航,并通过单击或按Enter键或空格键选择颜色。每当颜色选择器的颜色发生变化时,就会发出colorChanged()信号

我是新来的。如何创建这样的颜色选择器控件?我需要把它放在另一个小部件或对话框上。所选颜色应为白色矩形或以另一种方式区分

我需要使用哪些控件来创建这样的小部件


您可以使用
QtColorPicker
:QtColorPicker类提供了一个小部件,用于从弹出的颜色网格中选择颜色

用户可以通过单击颜色选择器,或导航到它并按空格键来调用它。他们可以使用鼠标键或箭头键在网格上的颜色之间导航,并通过单击或按Enter键或空格键选择颜色。每当颜色选择器的颜色发生变化时,就会发出colorChanged()信号

参考资料


生成这种布局的代码大致如下所示:

QWidget w;
QGridLayout *grid = new QGridLayout(&w);

std::vector<QString> colors{ "red", "blue", "green", "yellow",
                             "magenta", "darkblue", "darkgreen", "black" };

static const int buttonsPerRow = 5;
for (int i = 0; i < 15; ++i)
{
  QPushButton *btn = new QPushButton(&w);
  // Customize the colour button
  btn->setMaximumSize(16, 16);
  QString qss = QString("background-color: %1").arg(colors[i % colors.size()]);
  btn->setStyleSheet(qss);
  grid->addWidget(btn, i / buttonsPerRow, i % buttonsPerRow);
}

w.show();
qw;
QGridLayout*grid=新的QGridLayout(&w);
矢量颜色{“红”、“蓝”、“绿”、“黄”,
“洋红色”、“深蓝色”、“深绿色”、“黑色”};
静态常量int按钮错误=5;
对于(int i=0;i<15;++i)
{
QPushButton*btn=新的QPushButton(&w);
//自定义颜色按钮
btn->setMaximumSize(16,16);
QString qss=QString(“背景色:%1”).arg(颜色[i%colors.size());
btn->设置样式表(qss);
grid->addWidget(btn,i/buttonsPerRow,i%buttonsPerRow);
}
w、 show();

这不是最好的方法,但它只是通过自定义按钮、网格布局和样式表来展示想法。更好的做法是创建自定义小部件并自己在其内部绘制

mainwindow.ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QWidget" name="gridLayoutWidget">
    <property name="geometry">
     <rect>
      <x>30</x>
      <y>20</y>
      <width>331</width>
      <height>201</height>
     </rect>
    </property>
    <layout class="QGridLayout" name="gridLayout"/>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>400</width>
     <height>19</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

主窗口
0
0
400
300
主窗口
30
20
331
201
0
0
400
19
顶部工具栏区域
假的
主窗口

#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
#定义主窗口
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
私人:
Ui::MainWindow*Ui;
};
#endif//main窗口
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "custombutton.h"



MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->centralWidget->setStyleSheet("background-color: black;");


    QList<CustomButton *> * btnlist = new QList<CustomButton *>();

    CustomButton * btn = new CustomButton(Qt::green, btnlist);
    CustomButton * btn1 = new CustomButton(Qt::yellow, btnlist);
    CustomButton * btn2 = new CustomButton(Qt::red, btnlist);
    CustomButton * btn3 = new CustomButton(QColor(100,50,240), btnlist);
    CustomButton * btn4 = new CustomButton(QColor(50,50,240), btnlist);
    CustomButton * btn5 = new CustomButton(QColor(100,155,240), btnlist);
    CustomButton * btn6 = new CustomButton(QColor(200,50,240), btnlist);
    CustomButton * btn7 = new CustomButton(QColor(0,50,240), btnlist);

    btnlist->append(btn);
    btnlist->append(btn1);
    btnlist->append(btn2);
    btnlist->append(btn3);
    btnlist->append(btn4);
    btnlist->append(btn5);
    btnlist->append(btn6);
    btnlist->append(btn7);

    this->ui->gridLayout->addWidget(btn,1,1);
    this->ui->gridLayout->addWidget(btn1,1,2);
    this->ui->gridLayout->addWidget(btn2,1,3);
    this->ui->gridLayout->addWidget(btn3,1,4);
    this->ui->gridLayout->addWidget(btn4,1,5);

    this->ui->gridLayout->addWidget(btn5,2,1);
    this->ui->gridLayout->addWidget(btn6,2,2);
    this->ui->gridLayout->addWidget(btn7,2,3);
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括“custombutton.h”
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
ui->centralWidget->setStyleSheet(“背景色:黑色;”);
QList*btnlist=新的QList();
CustomButton*btn=新的CustomButton(Qt::绿色,btnlist);
CustomButton*btn1=新的CustomButton(Qt::黄色,btnlist);
CustomButton*btn2=新的CustomButton(Qt::红色,btnlist);
CustomButton*btn3=新的CustomButton(QColor(100,50240),btnlist);
CustomButton*btn4=新的CustomButton(QColor(50,50240),btnlist);
CustomButton*btn5=新的CustomButton(QColor(100155240),btnlist);
CustomButton*btn6=新的CustomButton(QColor(200,50240),btnlist);
CustomButton*btn7=新的CustomButton(QColor(0,50240),btnlist);
btnlist->append(btn);
btnlist->append(btn1);
btnlist->append(btn2);
btnlist->append(btn3);
btnlist->append(btn4);
btnlist->append(btn5);
btnlist->append(btn6);
btnlist->append(btn7);
这个->用户界面->网格布局->添加小部件(btn,1,1);
这个->用户界面->网格布局->添加小部件(btn1,1,2);
这个->用户界面->网格布局->添加小部件(btn2,1,3);
这个->用户界面->网格布局->添加小部件(btn3,1,4);
这个->用户界面->网格布局->添加小部件(btn4,1,5);
这个->用户界面->网格布局->添加小部件(btn5,2,1);
这个->用户界面->网格布局->添加小部件(btn6,2,2);
这个->用户界面->网格布局->添加小部件(btn7,2,3);
}
自定义按钮

#ifndef CUSTOMBUTTON_H
#define CUSTOMBUTTON_H

#include <QWidget>
#include <QPushButton>
#include <QColor>

class CustomButton : public QPushButton
{
public:
    CustomButton(QColor color, QList<CustomButton *> *);

public slots:
    void release(bool);

private:
    QList<CustomButton *>       * btn_list;

};

#endif // CUSTOMBUTTON_H
\ifndef CUSTOMBUTTON\u H
#定义自定义按钮
#包括
#包括
#包括
类CustomButton:公共QPushButton
{
公众:
自定义按钮(QColor颜色,QList*);
公众时段:
无效释放(bool);
私人:
QList*btn_列表;
};
#endif//CUSTOMBUTTON\u H
custombutton.cpp

#include "custombutton.h"



CustomButton::CustomButton(QColor color, QList<CustomButton *> * list)
{
    this->btn_list = list;
    QString StyleSheet = QString("QPushButton:checked { border: 2px solid white; background-color: %1; } QPushButton { border: 0px solid white; background-color: %1; }").arg(color.name());
    this->setCheckable(true);
    this->setStyleSheet(StyleSheet);
    this->setFixedSize(56, 56);
    this->show();
    connect(this, &CustomButton::toggled, this, &CustomButton::release );
}

void CustomButton::release(bool checked)
{
    int ind = this->btn_list->indexOf(this);
    CustomButton * tmp = this->btn_list->takeAt(ind);

    if(checked)
    {
        this->setChecked(true);

        for(int i = 0; i < this->btn_list->count(); i++)
        {
            this->btn_list->at(i)->setChecked(false);
        }
    }

    this->btn_list->append(this);
}
#包括“custombutton.h”
CustomButton::CustomButton(QColor颜色,QList*列表)
{
此->btn\U列表=列表;
QString样式表=QString(“QPushButton:选中{边框:2px纯白;背景色:%1;}QPushButton{边框:0px纯白;背景色:%1;}”).arg(color.name());
此->可设置检查(真);
此->设置样式表(样式表);
此->设置固定大小(56,56);
此->显示();
连接(此、&CustomButton::toggled、此、&CustomButton::release);
}
作废自定义按钮::释放(布尔选中)
{
int ind=this->btn\u list->indexOf(this);
CustomButton*tmp=this->btn\U list->takeAt(ind);
如果(选中)
{
此->设置已选中(true);
对于(int i=0;ibtn_list->count();i++)
{
此->btn\U列表->at(i)->设置检查(假);
}
}
此->btn\U列表->附加(此);
}
main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
#包括“mainwindow.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
w、 show();
返回a.exec();
}

这是一份工作草案。不要在发行版中使用此选项:)这只是为了说明如何做到这一点

什么是彩色矩形:按钮、标签?@vahancho我需要它看起来像这样。我可以自由选择任何工具来实现它,甚至可以自己用OpenGL渲染。@Yola,如果你可以自由使用任何工具,为什么你说它应该是小部件?您可以在QML中在一分钟内完成此操作。@Xplatforms项目不使用QML。