circle 안에 이미지가 들어가는 형태를 구현하기가 생각보다 어렵고.


고정된 이미지일 경우 style sheet로 간단하게 구현이 된다.


하지만 로컬 이미지를 가지고? circle 형태의 QLabel을 만들기는 까다롭다



그래서 QLabel를 상속 받아서 다음과 같이 처리하면 쉽게? 그릴수 있다.

CircleLabel은 QLabel을 상속 받은 QWidget이다.

private:

void paintEvent(QPaintEvent *event) override;//paintEvent을 override한다


void CircleLabel::paintEvent(QPaintEvent *event)

{

QString pixmapPath = imagePath_;

if (imagePath_.isEmpty())

{

pixmapPath = ":image/defaultimage.png";

}

//draw main image

QPixmap mainPixmap(pixmapPath);

QPixmap scaled = mainPixmap.scaled(width(), height(), Qt::KeepAspectRatioByExpanding,                 Qt::SmoothTransformation);

QBrush brush(scaled);

QPainter painter(this);

painter.setRenderHint(QPainter::Antialiasing, true);

painter.setRenderHint(QPainter::SmoothPixmapTransform, true);

painter.setBrush(brush);

painter.setPen(QColor("red"));//pen 색을 적절히 지정해주면 antialiasing이 부족한 부분이 티가 덜 난다~

painter.drawRoundedRect(0, 0, width(), height(), 90, 90);

//만일 2개 이미지를 겹쳐서 그린 다면 다음과 같이 추가해주면 된다.- 첨부이미지 기준으로 스머프 우측 하단에 //설정 이미지와 같은.~

QPixmap settingPixmap(":image/Edit.png");

painter.drawPixmap(66, 66, settingPixmap);


QLabel::paintEvent(event);

}

by 무위자연 2018. 12. 10. 11:40

Completer가 보이는 UI를 custom할 수 있다.

그래서 준비한 2탄

treeview도 가능하고

table view도 가능하다.

QStringListModel *dateModel = new QStringListModel(stringList);


#1 completer를 표시할 UI를 생성한다. 예제는 tableview

QTableView* tableView = new QTableView(dateModel);
patientViewModel->setParent(tableView);
tableView->horizontalHeader()->setVisible(false);
tableView->setShowGrid(false);

dateCompleter->setPopup(tableView);//


그리고 itemdelegate를 set해서 tableview를 더 풍성하게 보이고 싶다면...


#2 itemDelegate를 생성한다.

이 생성한 itemdelegate를 tableview에 넣어도 반영되지 않는다. 다음과 같이  completer의 popup에 바로 set해줘야 한다.!!!
dateCompleter->popup()->setItemDelegate(itemDelegate);


#3 model을 생성해서 임의로 만들고 싶다면?

QStandardItemModel *completerModel = new QStandardItemModel();

index = 0;

for (const auto& curRecord : records)
{
    QString name = list[index].name;
    QString genderString = list[index].gender
    QString birth = list[index].birth;
    completerModel->setItem(index, 0, new QStandardItem(name));
    completerModel->setItem(index, 1, new QStandardItem(genderString));
    completerModel->setItem(index, 2, new QStandardItem(birth));
    index++;
} 
return completerModel;
}


by 무위자연 2018. 12. 6. 17:33

QTableView::item

{

background-color : bg_white;

margin-bottom: 10px;

border-bottom : 1px solid contents_outer;

border-top : 1px solid contents_outer;

outline:0px;

}


이런 식의 정보가 아니다!

tableView->verticalHeader()->setDefaultSectionSize(120);

by 무위자연 2018. 11. 29. 18:21

관련 에러 메시지 : 

QObject::connect No such slot QLineEdit::slotUpdateClearButton(const QString&)


해당 클래스는 QLineEdit을 상속 받은 custom 클래스다

다음과 같이 connect했으나 에러가 발생함.


connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(slotUpdateClearButton(const QString&)));


해당 메시지는 slot이 없다는 것으로 오해 할 수 있다.


하지만 이건 QObject가 그런(?) slot과 연결할 수 없다는 의미이다.


즉 비록 QLineEdit을 상속 받았지만 해당 custom class 존재를 QObject가 모르겠다는 의미이다.


이 경우 

class CustomWidget : public QLineEdit

{

Q_OBJECT//이거를 넣어줘야 한다!!!!

public:

explicit CustomWidget (bool enableClearBtn = false, QWidget* parent = nullptr);

virtual ~CustomWidget ();




by 무위자연 2018. 11. 20. 15:59
일시 : 2018.11.6

S.시작하며
-개발 세미나 참석은 처음이라 긴장도 되고 외롭기도 했는데.
-ios 개발은 원래 외로운 거더라고요~ 대부분 3명 이하의 조직?에서 개발.. 혼자도 많고
-개발도 잘하고 발표도 잘 하는 분들 많더라!! 이봉원님은 목소리까지 짱!
-계속 공부하고 계속 새로운 것을 봐야 하고 다른 사람들은 뭐하는지 보고 살아야 겠다
-뭔가 소통하고 싶었으나...말 걸...어려웠다ㅠ

-내 기준에서 주목 혹은 기록하고 싶은 것만 정리하면 다음과 같다.
A. iOS 라브 Ruby - 김은영님
ruby로 만들어진 bundler를 이용해서 개발/배포 작업에서 도움이 되는 gem을 사용한다.(사용법은 cocoapod과 동일)
*주목한 gem

1. Houston : local 환경에서 push 테스트할  있는  gem

https://github.com/nomad/houston 

2. Fastlane :  app store 업로드  심사 신청까지 해주는 gem

https://github.com/fastlane/fastlane 

가장 큰 이점은 로컬에서 심사를 위한 업로드로 40분씩  때리지 않아도 된다~


B. RIBs - 김남현님

우버에서 제안하는 크로스 프레임 워크

https://github.com/uber/RIBs/wiki 

모든 Flow를 Tree를 그린다는 관점에서 접근하는 것은 비단 모바일에서만 가능한 일은 아닐 것으로 보인다.


C. GraphQL

REST Api의 단점을 보완하고 HTTP의 특성을 잘 살려낸 API 구현 방식

차세대가 될지는 지켜봐야 하지만 장점이 많은 방식이고 이미 적용된 사례가 생겨나고 있음(GitHub)

https://graphql.org/learn/  


Z.맺으며

경품.

벌킨, 에어팟, 애플와치4!!!!....는 다 남 이야기 ㅠ


by 무위자연 2018. 11. 7. 13:51


just simple


example function : drawFooterArea(QPainter *painter, const QRect& rect, const QSqlRecord& record) const


1 set pen / brush the color you want

painter->setPen(Qt::red);

painter->setBrush(Qt::red);


2. draw Ellipse

painter->drawEllipse(rect);


if you don't set brush, just show circle line


by 무위자연 2018. 9. 27. 10:36


함수 선언을..

void error(char const *msg, bool showKind = true, bool exit);

이런 식으로 하면 다음과 같은 애러가 뜨게 된다.

default argument not at end of parameter list


이것의 의미는 끝에 기본 값을 안 줬다 이며 이것을 해결하기 위해서는

끝에서부터 기본값을 주기 시작해야 한다는 의미이다.

exit도 기본 값을 주던지 아니면 showKind를 제일 뒤로 보내야 한다~


더 자세한 설명은 https://stackoverflow.com/questions/5637679/default-argument-in-the-middle-of-parameter-list 

by 무위자연 2018. 9. 20. 12:29

enum 정의를 해서 사용하는데

그 정의가 늘어날 때마다 관련 코드를 넣는 것은 매우 고통스러운 일이다.

그리고 enum 실제 값과 해당하는 enum을 찾아서 처리해야하는 일들이 생긴다.

그 럴 때 사용하는 것이  QMetaEnum( 관련 문서 : http://doc.qt.io/qt-5/qmetaenum.html )이다.

예제.

class Currency : public QObject
{
Q_OBJECT
public:
enum class CurrencyType
{
    ABC = 1,
    CDE = 2,
    DEF = 3,
   _count,//이것이 있어야 함!!!
}
Q_ENUM(CurrencyType)

QObject를 상속 받아서 정의하고 _count를 넣은 다음에 Q_ENUM으로 정의해주어야 한다.
enum 값을 int로만 사용하면 static_cast<int>를 이용하면 충분하지만 enum의 이름을 사용할 필요가 있을 때 사용한다.

#1 QString to enum
QString 값을 enum value로 바꿔준다.
auto currencyMap = QMetaEnum::fromType<Currency::CurrencyType>(); //enum 클래스를 가지는 객체를 만든다.
QString currency = "ABC";
for (qint32 i = 0; i < currencyMap.keyCount(); i++)
{
    if (currencyMap.key(i) == currency)//key 값과  QString을 비교한다.
   {
                return Currency::CurrencyType(i); 
     }
}


#2 enum to QString

Currency::CurrencyType tempType = currency;

QString currencyString = QVariant::fromValue(currency).value<QString>();


by 무위자연 2018. 9. 11. 10:48


#1 QObject를 상속 받은 tooltip을 처리할 class를 선언한다


at ZenoToolTipHelper.h

class ZenoToolTipHelper : public QObject

{

Q_OBJECT

public:

explicit ZenoToolTipHelper(QObject* parent = NULL)

: QObject(parent)

{

}


protected:

bool eventFilter(QObject* obj, QEvent* event);

};


at ZenoToolTipHelper.cpp

#include <QAbstractItemView>

#include <QToolTip>

#include <QEvent>

#include <QHelpEvent>

bool ZenoToolTipHelper::eventFilter(QObject* obj, QEvent* event)

{

if (event->type() == QEvent::ToolTip)

{

QAbstractItemView* view = qobject_cast<QAbstractItemView*>(obj->parent());

if (view == nullptr)

{

return false;

}


QHelpEvent* helpEvent = static_cast<QHelpEvent*>(event);

QPoint pos = helpEvent->pos();

QModelIndex index = view->indexAt(pos);

if (index.isValid() == false)

return false;

//row , column을 적절하게 판단하여서 tooltip을 보여준다.

QFontMetrics fm(view->font());

QRect rect = view->visualRect(index);

int rectWidth = rect.width();


QToolTip::showText(helpEvent->globalPos(),               "tooltip 내용들", view, rect);

return true;


}

return false;

}


#2 #1에서 만들 class를 tableView에 set한다.

tableView->viewport()->installEventFilter(new ZenoToolTipHelper());

by 무위자연 2018. 7. 11. 15:06

QTextEdit에는 setMaxLength 함수가 없다


입력 글자수를 제한하기 위해서 다음과 같이 SLOT을 Connect한다


//member variable

QString tempMemo_ = {};



QTextEdit* memoEdit = dialog_->findChild<QTextEdit*>(toString(ControlID::editMemo));


if (memoEdit->toPlainText().length() > 256)//set maxlength 256

{


disconnect(memoEdit, SIGNAL(textChanged()), this, SLOT(slotValueChanged_memo())));


QTextCursor currentCursor = memoEdit->textCursor();


int pos = currentCursor.position();


memoEdit->setPlainText(tempMemo_);


currentCursor.setPosition(pos - 1, QTextCursor::MoveMode::MoveAnchor);


memoEdit->setTextCursor(currentCursor);


connect(memoEdit, SIGNAL(textChanged()), this, SLOT(slotValueChanged_memo())));


}


else

{

//keep text at last input

tempMemo_ = memoEdit->toPlainText();

}


by 무위자연 2018. 3. 12. 11:16
| 1 2 3 4 5 6 7 ··· 164 |